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

Перед вызовом процедуры все параметры заносятся в стек. Размещенные параметры удаляются из стека внутри вызываемой или вызывающей процедуры, так же можно использовать директиву RET n[2].

Что делать, если подпрограмма и сама активно использует стек? Для того что бы иметь доступ к сохраненным в стеке аргументам, необходимо в начале вызываемой процедуры сохранить в регистре bp адрес вершины стека для этого пишут пролог:

pushbp

movbp, sp

Теперь можно обращаться в аргументам в стеке относительно адреса, хранящегося в bp. Важно при этом помнить, что команда вызова процедуры САLL поместит на верхушку стека значение ip или ip и cs в зависимости от типа вызываемой подпрограммы[2].

Для восстановления состояния стека до его использования подпрограммой, необходимо загрузить в регистр spадрес хранящийся в bp (написать эпилог):

movsp, bp

popbp

Необходимо помнить, что поверх параметров, передаваемых в подпрограмму, в стек записываются командой call одно или два слова адреса возврата. Каждая процедура «знает» свой тип вызова (одно или два слова) и отступив от верхушки стека на +2 или на +4 читает параметры.

movax, bp+2; первый параметр при ближнем вызове

movax, bp+4; первый параметр при дальнем вызове[2].

 

ПРАКТИЧЕСКИЙ РАЗДЕЛ

Постановка задачи

Разработать две подпрограммы, одна из которых преобразует любую заданную букву в заглавную, а другая преобразует букву в строчную. Разработать программу, которая вводит с клавиатуры строку и замещает первые буквы всех слов заглавными, а остальные строчными буквами.

Описание решения задачи


include io.asm

data segment

maxdb 100

kolvodb?

strokadb 100 dup(?)

smallendb 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'

bigendb 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'

smallrudb 'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'

bigrudb 'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'

kolvo2db?

data ends

code segment

assumecs:code,ds:data

upsproc

pushcx; сохранение регистров в стек

push dx

push ax

mov dl,[bx]

pushbx

xorcx,cx; обнулениеcx

cmpdl,'z'

jngsmen

jmp m1

smen: mov cl,26

leabx,smallen

povtor1:mov al,[bx]

cmpdl,al

jzuv

jmp m2

uv: mov dl,[bx+26]

mov cx,0001h

jmp m101

m2: incbx

loop povtor1

m1: cmpdx,'я'

jngsmru

jmpm101

smru: mov cl,31

leabx,smallru

povtor3: mov al,[bx]

cmpdl,al

jeuvr

jmp m6

uvr: mov dl,[bx+31]

mov cx,0001h

m6: incbx

loop povtor3

m101: mov dh,00h

xorbx,bx

popbx

mov [bx],dl

xordx,dx

xorax,ax

xorcx,cx

pop ax

pop dx

pop cx

ret

upsendp

downsproc

push cx

push dx

push ax

mov dl,[bx]

pushbx

xorcx,cx

cmpdl,'Z'

jng ben

jmp m3

ben: mov cx,26

leabx,bigen

povtor2: mov al,[bx]

cmpdl,al

je me

jmp m4

me: mov al,[bx-26]

movdl,al

mov cx,0001h

jmp m102

m4: incbx

loop povtor2

m3: cmpdl,'Я'

jng bur

jmpm102

bur: mov cl,31

leabx,bigru

povtor4: mov al,[bx]

cmpdx,ax

je mu

jmp m8

mu: mov al,[bx-31]

movdl,al

mov cx,0001h

m8: incbx

loop povtor4

m102:mov dh,00h

xorbx,bx

popbx

mov [bx],dl

xordx,dx

xorax,ax

xorcx,cx

pop ax

pop dx

pop cx

ret

downsendp

start: movax,data

movds,ax;загрузитьсегментныйадресданных

leadx,max; заносим в регистр dx

movah,0ah;функция ввода строки с клавиатуры

int 21h; вывод на экран

xorax,ax; обнуление

leabx,kolvo; заносим в регистр bx

movcl,[bx];вcl записывается начала массива [bx]

 

movkolvo2,cl; в регистр записывается kolvo2

movkolvo,' '; вkolvo записывается пробел

leabx,kolvo; заносится в регистр bx

beg: moval,[bx];вal записывается начала массива [bx]

cmpal,' ';сравнение al с пробелом

jzrav

call downs

jmp m21

rav: incbx

call ups

dec cx

m21: incbx

loop beg

lea bx,kolvo2

mov al,[bx]

movbl,al

mov word ptr [bx+2], '$'

mov dl,0ah

mov ah,02h

int 21h

leadx,stroka

mov ah,09h

int 21h

mov ah,01h

int 21h

QUIT: mov ax,4c00h

int 21h

code ends

end start


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: