Пример Вычислить max(a,b) + max(5,a-1)
Решение. Опишем процедуру вычисления максимума двух переменных.
Для передачи первого параметра будем использовать регистр AX, для второго - регистр BX. Результат процедура будет помещать в регистр AX.
model small
.stack 128
.data
A dw?
B dw?
REZ dw?
.code
; процедура вычисляет максимальное из двух чисел
; первое число в AX, второе - в BX
; результат помещается в AX
MAX proc
cmp ax,bx
jge M
mov ax,bx
M: ret
MAX endp
start:...
mov ax,A
mov ax,B
call MAX; результат в AX
mov rez,ax
mov ax,5
mov bx,A
dec bx
call MAX; результат в AX
add rez,ax
...
end start
Передача параметра по ссылке
Пример Число (неотрицательное) разделить на 16. И оставить там же, где находилось.
Для сравнения с паскалем procedure DEL (var x: integer) Параметр-переменная
Основная программа записывает в регистр адрес фактической переменной.
В качестве регистра необходимо выбирать регистр-модификатор. Пусть BX.
Процедура
; делит неотр. xисло X на 16
; в регистре BX - адрес X Результат записывается в X
DEL proc near
mov cl,4
shr word ptr [bx],cl
ret
DEL endp
Основная программа
|
|
; адрес числа в регистре BX
lea bx, A
call DEL
lea bx, B
call DEL
Задача.
Даны два массива однобайтовых чисел без знака. Найти сумму их максимальных элементов.
Опишем нахождение максимального элемента массива процедурой.
Формальными параметрами процедуры являются начальный адрес массива, количество элементов массива.
Будем передавать параметры через регистры. Адрес массива - через регистр BX. Кол-во элементов - через CX
Результат возвращаем основной программе через AL (элементы однобайтовые).
Masm
model small
.stack 128
.data
n equ 10
m equ 15
mas1 db n dup (?)
mas2 db m dup (?)
; процедура находит максимальный элемент массива
; адрес массива находится в регистре BX
; кол-во элементов - в CX
; результат возвращаем через AL
max proc
mov al,0;
sled: cmp [bx],al
jle new
mov al,[bx]
new: inc bx
loop sled
ret
max endp
start:...
lea bx,mas1
mov cx,n
call max; результат в al
mov dl,al
lea bx,mas2
mov cx,m
call max
add dl,al
...
end start