Передача параметров через стек.

В предыдущих уроках все параметры передавались процедурам через регистры. В этой статье мы рассмотрим другой способ — передачу параметров через стек. Часто этот способ оказывается удобнее. Через регистры можно передать максимум 6-7 параметров, а через стек — сколько угодно. Подробнее о стеке можно узнать в этой статье: Стек в Assembler.

Помещение параметров в стек

Перед вызовом процедуры параметры необходимо поместить в стек с помощью команды PUSH. Здесь существует два варианта: параметры могут помещаться в стек в прямом или в обратном порядке. Параметры помещаются в стек, начиная с последнего, так что перед вызовом процедуры на вершине стека оказывается первый параметр:

; Данные
arg0     dw 0
arg1     dw 12
argN     dw 345
;---------------------------------------------------------------------
; Код
    push [argN]
    push ...
    push [arg1]
    push [arg0]
    call myproc

Обращение к параметрам внутри процедуры

Для обращения к параметрам внутри процедуры обычно используют регистр BP. В самом начале процедуры содержимое регистра BP сохраняется в стеке и в него копируется значение регистра SP. Это позволяет «запомнить» положение вершины стека и адресовать параметры относительно регистра BP.

;Процедура
myproc:
    push bp
    mov bp,sp
    ...

Извлечение параметров из стека

После того, как процедура выполнилась, необходимо очистить стек, вытолкнув из него параметры. Тут тоже существует 2 способа: стек может быть очищен самой процедурой или кодом, который эту процедуру вызывал. Для первого способа используется команда RET с одним операндом, который должен быть равен количеству байтов, выталкиваемых из стека. В нашем случае он должен быть равен количеству параметров, умноженному на 2.

    push [arg1]
    push [arg0]
    call myproc
    ...
;----------------------------------------------------------------------
;Процедура c двумя параметрами
myproc:
    push bp
    mov bp,sp
    ...
    pop bp
    ret 4        ;Из стека дополнительно извлекается 4 байта

Для второго способа нужно использовать команду RET без операндов. Стек восстанавливается после выполнения процедуры путём прибавления значения к SP. С помощью такого способа программируются процедуры с переменным количеством параметров. Процедура не знает, сколько ей будет передано параметров, поэтому очистка стека должна выполняться вызывающим кодом.

    push [arg1]
    push [arg0]
    call myproc2
    add sp,4                ;Восстановление указателя стека
    ...
;----------------------------------------------------------------------
;Процедура с двумя параметрами (не очищает стек)
myproc2:
    push bp
    mov bp,sp
    ...
    pop bp
    ret

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Chinese (Traditional)EnglishJapaneseRussianUkrainian

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: