Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПС(2)16.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
116.74 Кб
Скачать

Лабораторная работа 3

Подпрограмма и стек

ЦЕЛЬ РАБОТЫ: исследование особенностей записи и обращения к подпрограммам, изучение методов использования стека при создании программ.

2. Программа исследования процесса выпол­нения команд вызова и возврата из под­про­грамм, а также команд работы со стеком.

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

call m1 ; вызов подпрограммы

int 20h

m1:

pushf ;сохраняем в стеке регистр флагов

push bx ; -''- bx

push dx ; -''- dx

push cx ; -''- cx

mov ax,05

mov bx,ax

add ax,ax

mov dx,ax

mov cx,ax

pop cx ; извлекаем из стека cx

pop dx ; -''- dx

pop bx ; -''- bx

popf ; -''- регистр флагов

ret ; возврат из подпрограммы

cdseg ends

end start

Задание: загрузить программным путем массив чисел. Сделать выборку чисел от 2 до 6 и возвести их в квадрат.

вар.

Массив

16

3

2

9

6

7

9

4

6

0

4

cdseg segment 'code'

assume cs:cdseg

org 100h

start:

mov cx,(offset dest-offset source)/2

mov si,offset source

mov di,offset dest

m1:

lodsw ; загружаем из памяти слово

cmp ax,2 ; сравниваем его с нижней границей

jb m2 ; если меньше, то прыгаем на m2

cmp ax,6 ;сравниваем с верхней границей

ja m2 ; если больше, то прыгаем на m2

call sq ; вызываем подпрограмму

stosw ; сохраняем результат в памяти

m2:

loop m1

int 20h

sq: ;подпрограмма возводит в квадрат содержимое ах

push cx ; затолкаем с стек сх

mov cx,ax ; счётчик

mov dx,0 ; результат

mov bx,0 ; ещё один счётчик

a1:

inc bx ; увеличим счётчик bx на 1

mov ax,bx ; проверяем bx на чётность

and ax,1

je a1 ;если bx - чётное, то прыгаем на a1

add dx,bx ; добавим к результату очередное нечётное число

loop a1

mov ax,dx ; перенесём результат в ax

pop cx ;восстановим сх

ret ; возврат из подпрограммы

; data

source dw 3,2,9,6,7,9,4,6,0,4

dest dw (offset dest-offset source)/2 dup (0)

cdseg ends

end start

Результат: 32 = 910(916), 22 = 410(416), 62 = 3610(2416), 42 = 1610(1016), 62 = 3610(2416), 42 = 1610(1016).

Контрольные вопросы:

  1. Укажите порядок выполнения команды ret.

Ответ: Команда возврата из процедуры RET возвращает управление из процедуры, вызванное ранее командой CALL. Команда RET заносит слово из стека в регистр IP и увеличивает значение регистра SP на 2. Для межсегментного возврата команда RET, кроме того, заносит слово из новой вершины стека в регистр CS и еще раз увеличивает значение SP на 2. Любой числовой операнд команды прибавляется к указателю стека SP.

  1. Сравните процесс выполнения команд call и ret.

Ответ: Команда вызова процедура CALL осуществляет передачу управление по адресу процедуры, на которую ссылается операнд команды. Эта команда используется для сохранения адреса точки возврата в стек. Возврат из вызванной процедуры осуществляется по команде RET в точку программы, следующей за командой вызова CALL. Команда RET извлекает из стека адрес точки возврата.