Цитата:
Сообщение от gav
for i:=1 to 20 do
begin
a:=a+b;
b:=a+b;
end;
|
Да, короче всего код для "нисходящего" цикла.
mov ecx,20
a0:
add eax,ebx
add ebx,eax
loop a0
Комнада loop уменьшает ecx на 1 и если результат больше 0, то переход на метку а0.
А компиляция "в лоб" дала бы более длинный код:
mov ecx,1
a0:
add eax,ebx
add ebx,eax
inc ecx
cmp ecx,20
jbe a0
Цитата:
Сообщение от gav
mov ch,5
mov ah, 51h
xor al,al
sub ah,ch
int 21h
|
Аффтар кода шутник, однако

Код эквивалентен коду:
mov ax,4C00h
int 21h
Короче стандартное завершение DOS-программы (код возврата = 0).
Цитата:
Сообщение от saovu
Old_2Fh_Vector:
Entry:
jmp near ptr Begin ; эта команда занимает три байта
fourthbyte db 0
|
4-байтная переменная, для хранения адреса (16-битный сегмент: 16-битное
смещение) обработчика прерывания, по совместительству выполняющая роль
исполняемого кода (jump на метку begin). При установке новых обработчиков
переменная разумеется модифицируется, и уже не годится для исполнения
Цитата:
Сообщение от saovu
MACRO Jmp_Next seg ; очистка очереди команд
db 0EAh ; jmp
dw $+4 ; адрес следующей команды
dw seg ; сегмент или селектор
ENDM
|
Дальний jump по абсолютному адресу, который вычисляется на этапе компиляции.
16-битное смещение зависит от положения точки применения макроса в исходном
коде, 16-битный сегментный адрес берется из того, что передается как параметр,
который тоже подставляется на этапе компиляции. Подобный прием используется
везде, где требуется сбросить конвейер процессора, чтобы избежать конфликтов.