Команды
.docПрименение: Команда применяется для восстановления содержимого вершины стека в регистр, ячейку памяти или сегментный регистр. Заметим, что недопустимо восстановление значения в сегментный регистр cs.
my_proc proc near push ax push bx ;тело процедуры, в которой изменяется содержимое ;регистров ax и bx ... pop bx pop ax ret endp
|
См. также: уроки 7, 10, 14, 15, 16, 17 и команды popa, popad, popf, popfd, push, pusha, pushad, pushf, pushfd
POPA
(POP All general registers from the stack)
Извлечение всех регистров общего назначения из стека
Схема команды: |
popa |
Назначение: извлечение из стека регистров общего назначения di, si, bp, sp, bx, dx, cx, ax.
Синтаксис Алгоритм работы:
-
извлечь из стека последовательно значения и загрузить ими регистры общего назначения di, si, bp, sp, bx, dx, cx, ax. Содержимое di восстанавливается первым. Содержимое sp извлекается, но не восстанавливается;
-
увеличить значение указателя стека esp/sp на 16.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение: Команда popa по принципу работы является обратной команде pusha и используется для восстановления содержимого всех регистров общего назначения значениями из стека. Эту команду можно использовать в процедурах и программах обработки прерываний для восстановления регистров общего назначения прерванной программы.
.386 my_proc proc near pusha ;тело процедуры, в которой изменяется ;содержимое регистров общего назначения ... popa ret endp
|
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popad, popf, popfd, push, pusha, pushad, pushf, pushfd
PUSH
(PUSH operand onto stack)
Размещение операнда в стеке
Схема команды: |
push источник |
Назначение: размещение содержимого операнда источник в стеке.
Синтаксис Алгоритм работы:
-
уменьшить значение указателя стека esp/sp на 4/2 (в зависимости от значения атрибута размера адреса — use16 или use32);
-
записать источник в вершину стека (адресуемую парой ss:esp/sp).
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение: Команда push используется совместно с командой pop для записи значений в стек и извлечения их из стека. Размер записываемых значений — слово или двойное слово. Также в стек можно записывать непосредственные значения. Заметьте, что в отличие от команды pop в стек можно включать значение сегментного регистра cs. Другой интересный момент связан с регистром sp. Команда push esp/sp записывает в стек значение esp/sp по состоянию до выдачи этой команды. В микропроцессоре i8086 по этой команде записывалось скорректированное значение sp. При записи в стек 8-битных значений для них все равно выделяется слово или двойное слово (в зависимости от use16 или use32).
my_proc proc near push ax push bx ;тело процедуры, в которой изменяется содержимое ;регистров ax и bx ... pop bx pop ax ret endp
|
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popf, popfd, pusha, pushad, pushf, pushfd
PUSHA
(PUSH All general registers onto stack)
Размещение всех регистров общего назначения в стеке
Схема команды: |
pusha |
Назначение: размещение в стеке регистров общего назначения в следующей последовательности: ax, cx, dx, bx, sp, bp, si, di.
Синтаксис Алгоритм работы:
-
уменьшить значение указателя стека esp/sp на 32/16 (в зависимости от значения атрибута размера адреса — use16 или use32);
-
включить в стек последовательно значения регистров общего назначения ax, cx, dx, bx, sp, bp, si, di.
Содержимое di при этом будет на вершине стека. В стек помещается содержимое sp по состоянию до выполнения команды. Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение: Команда pusha используется совместно с командой popa для сохранения и восстановления всех регистров общего назначения. Эти команды удобно использовать при работе с процедурами, программами обработки прерываний, а также в других случаях для сохранения и восстановления регистров общего назначения как части контекста некоторого вычислительного процесса.
my_proc proc near pusha ;тело процедуры, в которой изменяется ;содержимое регистров общего назначения ... popa ret endp
|
См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popad, popf, popfd, push, popa, pushad, pushf, pushfd
SUB
(SUBtract)
Вычитание
Схема команды: |
sub операнд_1,операнд_2 |
Назначение: целочисленное вычитание.
Синтаксис Алгоритм работы:
-
выполнить вычитание операнд_1=операнд_2-операнд_1;
-
установить флаги.
Состояние флагов после выполнения команды:
11 |
07 |
06 |
04 |
02 |
00 |
OF |
SF |
ZF |
AF |
PF |
CF |
r |
r |
r |
r |
r |
r |
Применение: Команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.
;выполнить вычитание 64-битных значений: vich_1-vich_2 vich_1 dd 2 dup (0) vich_2 dd 2 dup (0) rez dd 2 dup (0) ... ;ввести значения в поля vich_1 и vich_2: ;младший байт по младшему адресу ... mov eax,vich_1 sub eax,vich_2 ;вычесть младшие половинки чисел mov rez,eax ;младшая часть результата mov eax,vich_1+4 sbb eax,vich_2+4 ;вычесть старшие половинки чисел mov rez+4,eax ;старшая часть результата
|
См. также: урок 8, приложение 7 и команду sbb