Ассемблер Это просто! Учимся программировать


         

нибудь число. Например, перед вызовом



Оператор Перевод Применение Процессор
POP приемник pop - вытолкнуть Достать из стека число 8086

Допустим, нам нужно временно сохранит какое- нибудь число. Например, перед вызовом процедуры, прерывания или циклом
Вот как это запишется: ... (1) mov ax,345h (2) push ax (3) mov ah,10h (4) int 16h (5) pop ax ...
Здесь мы загружаем в AX число 345h, сохраняем его, ждем нажатия клавиши (при этом сама клавиша будет в AX, т.е. AX изменится) и восстанавливаем AX. В итоге AX будет содержать число 345h, что, как говорится, и требовалось доказать.
Однако, стоит заметить такой момент. Допустим, мы помещаем в стек следующие регистры: AX, BX, CX: push ax push bx push cx
Обратите внимание, что восстанавливать со стека нужно в обратном порядке: pop cx pop bx pop ax
Если вы поменяете местами регистры при восстановлении, то ничего страшного не произойдет, только содержать они будут другие числа. Например: mov ax,1234h mov bx,5678h push ax push bx pop ax pop bx
В итоге AX будет равен 5678h, а BX - 1234h.
Но в процедурах необходимо очень тщательно следить за стеком. Вот пример: ... call Our_proc int 20h ... Our_proc proc mov ax,15 push ax mov ah,9 mov dx,offset Str int 21h ret Our_proc endp ...
Обратите внимание, что мы "забыли" восстановить из стека AX в нашей процедуре (Our_proc). Что произойдет? Компьютер, дойдя до оператора ret, вытащит из стека не адрес возврата, а число 15 и перейдет на этот адрес. Что находится по адресу 15 - не известно. Машина, скорее всего, "зависнет". Надеюсь, что это понятно.
Следить за стеком (как уже говорилось) позволяет пара регистров SS (сегмент):SP (смещение).
Программист может менять как сегмент, так и смещение, но при этом следует иметь ввиду, что перед сменой регистров SS и SP необходимо запретить все прерывания, а после изменения разрешить (запрет прерываний вешает компьютер! Восстановление же - приводит к нормальной работе. После команды cli всегда должна идти sti, иначе компьютер виснет!). Это позволяют сделать следующие операторы:
Оператор Перевод Применение Процессор
CLI CLear Interrupt - запретить Запретить прерывания 8086
<

Содержание  Назад  Вперед