Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Код:
.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 изменяется
< каких там ещё "операций над sp", sp не меняется >
mov al, [bp+4];х; читаем входной параметр х на стеке, заносим в al
div c ; делим х на 3
mov bl, 2; заносим в bl,2
cmp al, bl; сравниваем al и bl
< а надо сравнивать ah и bl. Остаток от деления заносится в ah >
je m2;если равно,то переходим в m2
cmp al, bl; сравниваем al и bl
jne br2 ;если не равно,то переходим в br2
< эти две зелёные команды никому не нужны, если блок br2 перетащить сюда >
m2:
mov bl, [bp+6] ; записываем в bl, а
mul al ; умножаем на al
< а что у нас в al? Правильно, результат деления х на 3. брак >
mov y1, bl; bl записываем, как y1
< а вас просили передавать результат через стек. низачёт >
pop bp;Передает слово (помещенное ранее в стек) в указанный операнд, извлекает слово из стека и увеличивает значение в регистре bp на 2.
< перепутали в описании bp и sp. sp увеличивается на 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 изменяется
< каких там ещё "операций над sp", sp не меняется >
mov al, [bp+4] ; читаем входной параметр на стеке, заносим в al
mov bl, [bp+6] ; читаем входной параметр на стеке,заносим в bl
cmp al, bl; сравниваем параметры
jg ma;если больше, то переходим в ma
< получите переход, если a < x, а надо наоборот. Забыли, что в каком регистре >
cmp al, [bp+6] ; сравниваем параметры
jng bra;если меньше или равно,то переходим в bra
< эти две зелёные команды никому не нужны, если блок bra перетащить сюда. Кстати, bra — это сокращение от бюстгальтер >
ma:
sub bl, al ; вычитаем
mov y2, al ; заносим аl в y2
< замечательно, результат вычитания в bl, а заносим al >
< а вас просили передавать результат через стек. низачёт >
pop bp
ret
bra:
add bl,2; производим операцию сложения
mov y2, al ; заносим аl в y2
< замечательно, результат сложения в bl, а заносим al >
< а вас просили передавать результат через стек. низачёт >
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
< по случайному стечению обстоятельств в bl у вас действительно будет y2,
но это нисколько не оправдывает вашу небрежность.
Так возвращают параметры только в Индии. >
mov y, al; заносим результат y в регистр al
mov ah, 4ch;DOS функция выхода из программы
int 21h; Выход из программы
end begin; завершение
та не може такого бути!
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|