Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2011, 01:10   #1
Аннэтт
Новичок
Джуниор
 
Регистрация: 18.01.2011
Сообщений: 1
Радость Ассемблер.Подпрограммы.

Написать программу на языке ассемблера для вычисления значения 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 Данные.JPG (14.9 Кб, 96 просмотров)
Аннэтт вне форума Ответить с цитированием
Старый 18.01.2011, 05:11   #2
veniside
Старожил
 
Регистрация: 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; завершение
Цитата:
результат не сходится
та не може такого бути!
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подпрограммы nolx Помощь студентам 8 15.02.2011 18:08
Подпрограммы dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 1 18.07.2010 15:31
Подпрограммы оО) SkyL1ne Помощь студентам 5 24.05.2010 21:21
Подпрограммы-процедуры, подпрограммы-функции в Pascal rishikesh Помощь студентам 19 18.05.2010 23:05
Ассемблер и подпрограммы 4yvak123 Фриланс 4 10.08.2009 19:28