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

Ставки на матчи онлайн на сайте http://winline.ru. |

ГЛАВА 06 - часть 2


/p>


Оператор Перевод Применение Процессор
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
<


Начало  Назад  Вперед



Книжный магазин