Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ассемблер.Подпрограммы.  (Прочитано 13170 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Аннэт21
Новенький

ru
Offline Offline

« : 17-01-2011 22:29 » 

Написать программу на языке ассемблера для вычисления значения 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; завершение

отладчик
ошибок не выводит,но и результат не сходится. прошу помочь, объяснить..

* Данные.JPG (14.95 Кб - загружено 1137 раз.)
Записан
zhan313
Интересующийся

ru
Offline Offline

« Ответ #1 : 05-02-2011 14:43 » 

На вскидку: во второй процедуре на выходе всегда AL, хотя результат операции находится в BL
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 05-02-2011 15:51 » 

zhan313, непонятно. Если ты умеешься пользоваться отладчиком, то, очевидно, ты можешь просмотреть исполнение программы по шагам и обнаружить, в каком месте появляются неправильные данные. Или ты предлагаешь это сделать другим? "На вскидку" тут не надо, тут надо точно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zhan313
Интересующийся

ru
Offline Offline

« Ответ #3 : 09-02-2011 09:06 » 

Понял, исправляюсь.
sub bl, al ; вычитаем
mov y2, al ; заносим аl в y2
pop bp
ret

bra:
add bl,2; производим операцию сложения
mov y2, al ; заносим аl в y2

результаты команд
sub bl,al
и
add bl,2

будут находиться в bl, а в y2 заносится значение из al
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines