Перед вызовом процедуры все параметры заносятся в стек. Размещенные параметры удаляются из стека внутри вызываемой или вызывающей процедуры, так же можно использовать директиву RET n.
Что делать, если подпрограмма и сама активно использует стек? Для того что бы иметь доступ к сохраненным в стеке аргументам, необходимо в начале вызываемой процедуры сохранить в регистре bp адрес вершины стека для этого пишут пролог:
pushbp
movbp, sp
Теперь можно обращаться в аргументам в стеке относительно адреса, хранящегося в bp. Важно при этом помнить, что команда вызова процедуры САLL поместит на верхушку стека значение ip или ip и cs в зависимости от типа вызываемой подпрограммы.
Для восстановления состояния стека до его использования подпрограммой, необходимо загрузить в регистр spадрес хранящийся в bp (написать эпилог):
movsp, bp
popbp
Необходимо помнить, что поверх параметров, передаваемых в подпрограмму, в стек записываются командой call одно или два слова адреса возврата. Каждая процедура «знает» свой тип вызова (одно или два слова) и отступив от верхушки стека на +2 или на +4 читает параметры.
movax, bp+2; первый параметр при ближнем вызове
movax, bp+4; первый параметр при дальнем вызове.
ПРАКТИЧЕСКИЙ РАЗДЕЛ
Постановка задачи
Разработать две подпрограммы, одна из которых преобразует любую заданную букву в заглавную (в том числе для русских букв), а другая преобразует букву в строчную. Разработать программу, которая вводит с клавиатуры строку и замещает первые буквы всех слов заглавными, а остальные строчными буквами.
Описание решения задачи
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
Тестирование программы
Заключение
В ходе выполнения курсовой работы были изучены основные сведения о языке Ассемблер.В основные сведения входилиструктура и компоненты программы на Ассемблере, формат команд, реализация подпрограмм(процедур) на Ассемблере и др.
Сделали решение и описание задачи.Предоставили скриншот индивидуального задания с подпрограмм в Ассемблере.
Все поставленные задачи решены.
Список литературы
1. https://mydocx.ru/8-16912.html
2. Программирование на Ассемблере для персональных компьютеров: Учебно-методическое пособие (доц., к.т.н. Садовой Н.Н., доц., к.т.н. Жмайлов Б.Б), Ростов-на-Дону, 2001 г., 82 с.
3. https://ru.wikipedia.org/wiki/Язык_ассемблера
4. https://progopedia.ru/language/assembler/