Показать сообщение отдельно
Старый 17.06.2011, 11:26   #19
Paul Kellerman
Gold Member
 
Регистрация: 25.06.2005
Адрес: F000:FFF0
Сообщений: 1,830
По умолчанию

Цитата:
Сообщение от 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-битный сегментный адрес берется из того, что передается как параметр,
который тоже подставляется на этапе компиляции. Подобный прием используется
везде, где требуется сбросить конвейер процессора, чтобы избежать конфликтов.

Последний раз редактировалось Paul Kellerman; 17.06.2011 в 12:17.
Paul Kellerman вне форума   Ответить с цитированием
Реклама