Несколько примеров под x86/real mode...
Примечание: далее под словосочетанием "регистр общего назначения" подразумевается один из регистров: ax, bx, cx, dx, si, di, sp, bp.
(1) Классика:
mov r,0 ; -> xor r,r
mov d,s ; -> xchg d,s
mov r,a ; -> lea d,[a+b]
add r,b |
mov ax,0A000h ; -> push 0A000h
mov es,ax ; pop es
mov ax,ELEM_SIZE ; -> mov ax,ELEM_SIZE
mul index ; mul index
lea di,array ; add ax,offset array
add di,ax ; xchg di,ax
...ещё достигается хорошая оптимизация при применении вместо команд обычного умножения(деления) сдвигов -оч хорошие результаты :p2:
Анна
на степени двойки
Я еще со времен ПК8000 (на проце К580) задумывался, а почему не сделали вместо команд условного перехода типа JNZ, JZ, JC и т.д. просто условия (в виде префиксов например): IFNZ <команда> - мне кажется, так было бы удобнее, так как частенько условие нужно лишь для выполнения одной команды (только представьте: IFNZ DEC AX), а из-за этого приходится делать переход... а переходы по условию выглядели бы так: IFZ JMP adr. Однако так никто никогда не делал, из чего я заключаю, что это гораздо сложнее сделать при существующих архитектурах процессоров? (другой вариант - никто не догадался ;) ) С другой стороны - есть же префиксы-циклы REPNZ и т.д.
К счастью, все не так уж плохо. В некоторых архитектурах встречаются инструкции условного пропуска следующих за ними инструкций. Так в AVR RISC это команды SBIC/SBIS (Skip if Bit in I/O register is Cleared/Set) и SBRC/SBRS (Skip if Bit in Register is Cleared/Set). Следует отметить, что в AVR слово состояния процессора доступно как регистр ввода/вывода, поэтому эта архитектура является реально существующей реализацией рассмотренного тобой случая.
Впрочем, архитектуры с ортогональной системой команд (в основном RISC-процессоры и их RISC-подобные предшественники, exempli gratia, LSI-11) всегда отличались ощутимо большей долей рациональности, чем классические CISC-семейства - постепенно распухающие от объема устаревших инструкций и сгибающиеся под весом новых (в "родимом" x86 легко обнаруживаются следы i8080, и даже i8008, не говоря уж о том, что Pentium 4 до сих пор полноценно поддерживает 16-битный реальный режим). К слову, RISC-архитектуры легко справляются с проблемами "накопления совместимости" путем разумного использования исключений для программной эмуляции устаревших инструкций.
Вместо команды mov ax, 0 ,занимающей в памяти 5 байт, можно написать xor ax, ax , занимающую 1 байт. Хотя, это, наверное, общеизвестный факт, или нет? {Нам на лекции рассказали}
Существует на удивление много способов применения инструкций cbw/cwd "не по прямому назначению". Вот как, например, можно посчитать абсолютную величину 16-битного целого без применения команд условного перехода. Пусть в ax - исходное число, тогда
cwd
or dx,1
mul dx
cwd
xor ax,dx
sub ax,dx
mov ax,x
cwd
not dx
and ax,dx
mov x,ax
mov ax,x
sub ax,320
cwd
and ax,dx
and dx,320
add ax,dx
mov x,ax
xds
но ведь щас вроде как везде RISC-архитектура используется... я помню, первый раз увидел это слово (аббревиатуру) в описании первых AMD-процессоров... интересно, а можно программировать напрямую на микрокоде, в обход "интерпретатора" команд х86 ?