Архитектура инструкций / | \ R-R R-M M-M Это архитектура для инструкций типа ALU (т.е. для вычислений) R-R - может выполнятся только с регистрами (RISC) R-M - один из операндов может быть памятью (CISC) x86 M-M - все операнды могут быть памятью (CISC) VAX-11
Архитектура инструкций: Безадресные Одноадресные Двухадресные Трехадресные Четырехадресные Пример безадресной инструкции: +----------------+ | DI | Disable Interrupts +----------------+ процессор сам знает где и что ему делать Адресность инструкции
Пример одноадресной инструкции: +----------------+ | ADD | R1 | ACC = ACC + R1 +----------------+ (операнд приемник всегда аккумулятор) z80
Пример двухадрессной инструкции: +----------------+ | ADD | R1 | R2 | R1 = R1 + R2 +----------------+ (операнд приемник также является одним из операндов) x86
Пример трехадресной инструкции: +----------------+ |ADD| R1 | R2| R3| R1 = R2 + R3 +----------------+ RISC
Инструкции большей адресности, реализуются как правило через микрокод. Примеры: Пример четерехадресной инструкции операции работы со списками в VAX-11 Складыват два BCD числа: ADDP4 srclen, srcaddr, dsrlen, dstaddr Пример пятиадрессной инструкции VAX-11 Копирует одну строку в другую с заполнением пустого места (если есть) MOVC5 R0,R1,#0,R2,R3 MOVC5 source_string_len, source_string_address, filler, destination_string_len, destination_string_address Копирует одну строку в другую транслируя все символы по таблице с заполнением пустого места (если есть) MOVTC source_string_len, source_string_address, filler, translation_table_address, destination_string_len, destination_string_address
Команды могут иметь разный размер. Например RISC процессоры имеют фиксированный размер команды. CISC процессоры как правило имеют переменную длинну комманды (как правило от одного до 15 байтов) Intel iAPX432 имеет границы комманд не по границе байта, а вообще побитно. Длинна инструкции
В случаи CISC проблем нет. x86 mov eax, 012345678h ; 32 bit mode mov r32, i32 ; 5 bytes mov r32, i16 ; 4 bytes mov r32, si8 ; 3 bytes mov r32, i8 ; 3 bytes Но в RISC длинна команды ограничена. Соответсвенно при длинне комманды 32-бит загрузить непосредственным значением 32-битный регистр не получиться, не говоря о 64-бит SPARC sethi %hi(value), reg ! high 22 bit or %g0, %lo(value), reg ! low 13 bit SPARC sethi %uhi(value), regtemp or regtemp, %ulo(value), regtemp sllx regtemp, 32, regtemp sethi %hi(value), reg or reg, regtemp, reg or reg, %lo(value), reg Загрузка регистров
Наиболее интересно это сделано в транспьютерах. Почти все простые команды в транспьютерах имеют один байт. Перед командами с непосредственными операндами может идти префикс который добовляет лишние 4 бита в непосредственный опреанд. код PFIX n 2n NFIX n 6n LDC n 4n ADC n 8n LDC #123 => PFIX 1 PFIX 2 LDC 3 LDC -2 => NFIX 0 // Reg: FFFFFFFF LDC #e // shift: FFFFFFFE И это не только для загрузки например для переходов J n 0n Jump CALL n 9n Call CJ n An Conditional Jump Таже идея используется для расширения набора команд OPR n Fn Operate например OR 24 FB => PFIX #4 OPR #B
Тоже самое для переходов Есть команда 32-бит которая делает переход в любое место памяти Условный переход на меньшую дистанцию beq distant_label => bneq $1 jmp distant_label $1:
THIS SECTION IS UNDER CONSTRUCTION
Семейство микропроцессоров ARM поддерживает Thumb - набор запакованных команд (занимающих меньше места, чем основные команды ARM, и распаковыющихся во время исполнения). У процессора есть бит который показывает работает ли он в режиме Thumb, или только в нормальном режиме. Thumb
Учтите что поскольку в RISC процессорах команды имеют фиксированный размер и выровнены, то младшие несколько битов в назначении команд переходов просто не нужны Выровненные команды