
- •Вариант №16 Лабораторная работа 1
- •Контрольные вопросы:
- •1. Какие бывают команды перехода?
- •3. С помощью каких регистров признаков осуществляется каждая из них?
- •4. Каков формат команд перехода, и к какому способу адресации они относятся?
- •5. По каким условиям записывается 1 в каждый из разрядов регистра состояния мп?
- •Лабораторная работа 2
- •Контрольные вопросы:
- •Лабораторная работа 3
- •2. Программа исследования процесса выполнения команд вызова и возврата из подпрограмм, а также команд работы со стеком.
- •Контрольные вопросы:
- •Укажите порядок выполнения команды ret.
- •Сравните процесс выполнения команд call и ret.
- •В какой последовательности сохраняется и извлекается содержимое регистров мп в подпрограмме?
- •Как будет выполняться программа, если вместо команды popf в ней будет записана команда nop?
- •Лабораторная работа 4
- •Контрольные вопросы:
- •На чем основан алгоритм программы деления чисел?
- •Чем отличается программы 1 и 2?
- •Каким образом организуется образование цифры частного в программах 1 и 2?
- •Объясните организацию неявного счетчика в программе 2?
- •Лабораторная работа 5
- •Приведите примеры существующих алгоритмов умножения.
- •На чем основан алгоритм работы программы умножения?
- •Что такое «сдвиг влево», «сдвиг вправо»?
Лабораторная работа 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).
Контрольные вопросы:
Укажите порядок выполнения команды ret.
Ответ: Команда возврата из процедуры RET возвращает управление из процедуры, вызванное ранее командой CALL. Команда RET заносит слово из стека в регистр IP и увеличивает значение регистра SP на 2. Для межсегментного возврата команда RET, кроме того, заносит слово из новой вершины стека в регистр CS и еще раз увеличивает значение SP на 2. Любой числовой операнд команды прибавляется к указателю стека SP.
Сравните процесс выполнения команд call и ret.
Ответ: Команда вызова процедура CALL осуществляет передачу управление по адресу процедуры, на которую ссылается операнд команды. Эта команда используется для сохранения адреса точки возврата в стек. Возврат из вызванной процедуры осуществляется по команде RET в точку программы, следующей за командой вызова CALL. Команда RET извлекает из стека адрес точки возврата.