Написать программу на языке ассемблера для вычисления значения y. Значения y1 и y2 необходимо вычислять в подпрограммах; параметры в подпрограммы передавать через стек; результат также возвращать через стек. (
значения у1 и у2 на картинке,во вложений )
Мой код
.model small ;Модель памяти
.stack 100h ; Установка размера стека
.data; Начало сегмента данных программы
a db 6;Инициализация переменной a
x db 2;Инициализация переменной х
c db 3
y1 db 0;Инициализация переменной у1
y2 db 0;Инициализация переменной у2
y db 0;Инициализация переменной у
.code; Начало кода
Y_1 proc;подпрограмма Y_1
push bp; сохранение bp
mov bp, sp;выполнение операций над sp, значение в bp изменяется
mov al, [bp+4];х; читаем входной параметр х на стеке, заносим в al
div c ; делим х на 3
mov bl, 2; заносим в bl,2
cmp al, bl; сравниваем al и bl
je m2;если равно,то переходим в m2
cmp al, bl; сравниваем al и bl
jne br2 ;если не равно,то переходим в br2
m2:
mov bl, [bp+6] ; записываем в bl, а
mul al ; умножаем на al
mov y1, bl; bl записываем, как y1
pop bp;Передает слово (помещенное ранее в стек) в указанный операнд, извлекает слово из стека и увеличивает значение в регистре bp на 2.
ret; Команда "возврат из подпрограммы" последовательно выгружает старший и младший байты счетчика команд из стека, уменьшая указатель стека на 2.
br2:
mov bl, 9 ; заносим 9 в bl
mov y1, bl; заносим bl в y1
pop bp
ret
Y_1 endp ; завершение подпрограммы
Y_2 proc; подпрограмма Y_2
push bp; сохранение bp
mov bp, sp;выполнение операций над sp, значение в bp изменяется
mov al, [bp+4] ; читаем входной параметр на стеке, заносим в al
mov bl, [bp+6] ; читаем входной параметр на стеке,заносим в bl
cmp al, bl; сравниваем параметры
jg ma;если больше, то переходим в ma
cmp al, [bp+6] ; сравниваем параметры
jng bra;если меньше или равно,то переходим в bra
ma:
sub bl, al ; вычитаем
mov y2, al ; заносим аl в y2
pop bp
ret
bra:
add bl,2; производим операцию сложения
mov y2, al ; заносим аl в y2
pop bp
ret
Y_2 endp; завершение подпрограммы
begin:
mov ax, @data;Пересылаем адрес сегмента данных в регистр AX
mov ds, ax; Установка регистра DS на сегмент данных
xor ax,ax;устанавливает содержимое регистра AX в значение 0
mov al, a
push ax
mov al, x
push ax
call Y_1; вызов подпрограммы
call Y_2; вызов подпрограммы
mov al, y1; заносим значение y1 в al
mul bl; производим операцию умножения y1 и y2
mov y, al; заносим результат y в регистр al
mov ah, 4ch;DOS функция выхода из программы
int 21h; Выход из программы
end begin; завершение
отладчик
ошибок не выводит,но и результат не сходится. прошу помочь, объяснить..