Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ОС мои.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
2.82 Mб
Скачать
  1. Ассемблерные команды для работы со стеком. Пример программы.

Стек — это область памяти, специально выделяемая для временного хранения дан­ных программы. Важность стека определяется тем, что для него в структуре про­граммы предусмотрен отдельный сегмент. На тот случай, если программист забыл описать сегмент стека в своей программе, компоновщик tlink выдаст предупрежда­ющее сообщение.

Для работы со стеком предназначены три регистра:

  • SS — регистр сегмента стека;

  • SP/ESP — регистр указателя стека;

  • BP/EBP — регистр указателя базы "кадра стека”.

Размер стека зависит от режима работы процессора и ограничивается значени­ем 64 Кбайт (или 4 Гбайт в защищенном режиме). В каждый момент времени дос­тупен только один стек, адрес сегмента которого содержится в регистре SS. Этот стек называется текущим. Для того чтобы обратиться к другому стеку («переклю­чить стек»), необходимо загрузить в регистр SS другой адрес. Регистр SS автомати­чески используется процессором для выполнения всех команд, работающих со сте­ком.

Еще некоторые особенности работы со стеком:

  • Запись и чтение данных в стеке осуществляются в соответствии с принципом LIFO (Last In First Out — «последним пришел, первым ушел»).

  • По мере записи данных в стек последний растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком.

  • При использовании регистров ESP/SP и ЕВР/ВР для адресации памяти ассемблер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра SS.

Для организации работы со стеком существуют специальные команды записи и чтения:

Команда PUSH выполняет запись значения <источник> в вершину стека: push <источник>

Алгоритм работы этой команды включает два действия:

  1. Значение SP уменьшается на 2: (SP) = (SP) - 2

  2. Значение источника записывается по адресу, указываемому парой SS:SP

Команда POP выполняет запись значения из вершины стека по месту, указанно­му операндом <приемник> (значение при этом «снимается» с вершины стека): pop <приемник>

Алгоритм работы команды POP обратен алгоритму команды PUSH:

  1. Запись содержимого вершины стека по месту, указанному операндом <приемник>.

  2. Увеличение значения SP: (SP) = (SP) + 2

Команда PUSHA предназначена для групповой записи в стек. По этой команде в стек последовательно записывается содержимое регистров АХ, СХ, DX, BX, SP, BP, SI, DI. Заметим, что записывается оригинальное содержимое SP, то есть то, которое было до выдачи команды PUSHA.

Пример, рассмотрим фрагмент программы для пересылки бай­та из ячейки fls в ячейку fld:

masm

model small

.data

fls db 5

fld db ?

.code

start:

…..

push fls ;поместить значение в стек

pop fld ;записать из стека

end start

  1. Ассемблерные команды сложения и вычитания. Пример программы.

Команда inc прибавляет единицу к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.

Команда add выполняет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти. В качестве второго операнда можно указывать регистр (кроме сегментного), ячейку памяти или непосредственное значение. Однако, не допускается определять одновременно оба операнда как ячейки памяти. Операнды могут быть числами со знаком или без знака.

Команда adc выполняет сложение первого и второго операндов, прибавляя к результату значение флага переноса CF. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти. В качестве второго операнда можно указывать регистр (кроме сегментного), ячейку памяти или непосредственное значение. Однако, не допускается определять одновременно оба операнда как ячейки памяти. Операнды могут быть числами со знаком или без знака.

Команда dec вычитает единицу из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.

Команда sub вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется, замещаясь результатом вычитания. Второй операнд не изменяется.

Команда sbb вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Второй операнд не изменяется.

Пример:

mypr proc

mov ax,05h

mov dx,10h

mov bx,0

add bx, ax

add bx, dx

int 21h

mypr endp

end mypr

В регистре bx будет сумма ax и dx.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]