Примечание: далее под словосочетанием "регистр общего назначения" подразумевается один из регистров: ax, bx, cx, dx, si, di, sp, bp.
(1) Классика:
mov r,0 ; -> xor r,r
где r - регистр общего назначения;
Примечание: "бородатый" прием, получивший распространение в том или ином виде на многих архитектурах; в AVR он даже заслужил дополнительную мнемонику - "clr".
(2)
mov d,s ; -> xchg d,s
где d, s - регистры общего назначения;
замена применима в том случае, если значением s можно пожертвовать.
Примечание: на младших членах семейства x86 (I8088/I8086) инструкция "xchg" выполняется медленнее "mov".
(3)
mov r,a ; -> lea d,[a+b]
add r,b |
где
a - bx,bp или константа;
b - si, di или константа;
r - любой регистр общего назначения.
Примечание: кстати, многие ассемблеры автоматически заменяют "lea r,label" на "mov r,offset label" исходя из соображений, что настоящая инструкция "lea" в данном случае займет 4 байта, а "mov" - только 3.
(4) Загрузка константы в сегментный регистр:
mov ax,0A000h ; -> push 0A000h
mov es,ax ; pop es
Примечание: "push <константа>" появилась в системе команд x86 начиная с I80186.
(5) Получение адреса элемента массива по его индексу:
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
где
ELEM_SIZE - размер элемента массива,
index (регистр общего назначения или переменная в памяти) - индекс элемента, адрес которого нас интересует.
(6) Для особо ярых поклонников x86 и команд push/pop:
Если на входе в процедуру (или другой участок кода, от которого требуется сохранять, а затем восстанавливать значения некоторых регистров) сохраняется больше одного регистра, то последовательность "push"'ей можно заменить на "pusha", а "pop"'ов - на команду со звучным названием "popa".
Примечание: кстати, RISC-процессор SPARC при обращении к процедурам в большинстве случаев прекрасно обходится без технологии "толкай-тяни" благодаря использованию регистрового файла со скользящим окном, который в частности выполняет функции стека вызовов - в нем сохраняются адреса возврата, передаются параметры и хранятся локальные переменные.
May be continued... ;)
P.S. В дополнение - маленький пример, как это работает...