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




Перед вызовом процедуры все параметры заносятся в стек. Размещенные параметры удаляются из стека внутри вызываемой или вызывающей процедуры, так же можно использовать директиву 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/

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: