Консультация № 185630
20.03.2012, 15:33
83.29 руб.
0 37 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Ассемблер TASM
Размер переменных - байты

Задача: b^3-c^3/d^3

Программа такая:

.model small
.386
;.stack 100h
.data
b db ?
c db ?
d db ?

.code
mov ax, @data
mov ds, ax

mov al, b
cbw
mov bx, ax
mov al, b
imul al
imul bx
cwd
mov ebx, eax

mov al, c
cbw
mov cx, ax
mov al, c
imul al
imul cx
cwd
mov ecx, eax

sub ebx, ecx

mov al, d
cbw
mov dx, ax
mov al, d
imul al
imul dx
cwd
mov edx, eax

mov eax, ebx
cdq
idiv edx

mov ax, 4c00h <- ошибка: деление на ноль
int 21h
end


В конце выводит ошибку : Деление на ноль, т.е. она правильно считает делимое, после делимого выдает ошибку.

Что надо изменить, чтобы она правильно работала?!

Обсуждение

Неизвестный
20.03.2012, 16:03
общий
Адресаты:
Лучше все же исправить мою
давно
Посетитель
7438
7205
20.03.2012, 16:04
общий
Определитесь со значениями, то пишете:
b db 3
c db 2
d db 1

то:
b=3
c=1
d=2
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.03.2012, 16:06
общий
А в программе, вообще 4, 1, 1
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 16:07
общий
Адресаты:
Ну значения в принципе любые (положительные числа, от 0 до 9)
Неизвестный
20.03.2012, 16:09
общий
Адресаты:
Если будет конечно проще написать свою программу, то можно и так, только желательно с комментариями, если возможно
давно
Посетитель
7438
7205
20.03.2012, 16:11
общий
Да без разницы. Могу и исправить, и свою дать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 16:12
общий
Адресаты:
Было бы замечательно
давно
Старший Модератор
31795
6196
20.03.2012, 16:21
общий
20.03.2012, 16:57
Переделал Ваш вариант:
Код:
.model	small
.386
.stack 100h
.data
b db 4
c db 1
d db 1

.code
start: mov ax, @data
mov ds, ax

mov al, b
CALL Power
mov ecx,eax

mov al, c
CALL Power
sub ecx,eax

mov al, d
CALL Power
;
; push ecx;b^3-c^3
; push eax;d^3
; pop ecx;d^3
; pop eax;b^3-c^3
xchg eax,ecx
;
cdq;edx:eax=b^3-c^3
idiv ecx;(b^3-c^3)/d^3

mov ax, 4c00h
int 21h
;
Power:
cbw;al=>ax
cwde;ax=>eax p386 : )
mov ebx,eax
mul eax
imul ebx
ret
end start

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
20.03.2012, 16:25
общий
Адресаты:
Просто как бы замудренно написано, я половина тут не понимаю, можно ли как то ограничиться тем что есть в моей работе?!
давно
Посетитель
7438
7205
20.03.2012, 16:27
общий
это ответ
Здравствуйте, Yankov Dmitry!
Сначала предлагаю свой вариант:
Код:

.model small
.data
b db 3
c db 2
d db 1

.code
.386
start:
mov ax, @data
mov ds, ax

movsx eax, b ;команда делает знаковое расширение байта b до 32 бит регистра eax
call cube ;возводим в куб
mov ebx, eax ;сохраним

movsx eax, c ;аналогично, находим c^3
call cube
sub ebx, eax ;находим b^3 - c^3

movsx eax, d ;d^3
call cube
xchg eax, ebx ;меняем местами
cdq
idiv ebx ;делим (b^3 - c^3) / d^3

mov ax, 4c00h
int 21h

cube proc ;eax = eax^3
mov ecx, eax ;ecx = eax
imul eax, eax ;eax = eax * eax
imul eax, ecx ;eax = eax ^3
ret
cube endp

end start


Переделанный Ваш вариант.
Повторяющийся фрагмент оформил подпрограммой.
Убрал лишние присваивания
Код:

.model small
.386
.data
b db 3
c db 2
d db 1

.code
start:
mov ax, @data
mov ds, ax

mov al, b
call cube
mov ebx, eax

mov al, c
call cube
sub ebx, eax

mov al, d
call cube
xchg eax, ebx
cdq
idiv ebx

mov ax, 4c00h
int 21h

cube proc
cbw
mov cx, ax
imul al
imul cx
cwde
ret
cube endp

end start
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.03.2012, 16:34
общий
Добавил исправленную Вашу программу
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 16:40
общий
Адресаты:
Спасибо вам огромное!
давно
Посетитель
7438
7205
20.03.2012, 16:40
общий
Я подправил во втором варианте маленькую неточность.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.03.2012, 16:41
общий
Все понятно?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
20.03.2012, 16:44
общий
Код:
mov	al,	b
CALL Power

Загружаем байт в AL
Вызываем подпрограмму возведения в степень.
Вход: AL
Выход: ЕАХ = AL^3

Подпрограмма:

Power:
cbw;al=>ax
cwde;ax=>eax
mov ebx,eax
mul eax
imul ebx
ret

Расширяем до слова;
Расширяем до двойного слова при этом в отличии от cwd(AX => DX:AX) выполняется разширение АХ => ЕАХ;
Запоминаем множитель в ЕВХ;
Умножение, тут без разницы, знаковое оно или нет, т.к. возводится в квадрат;
Умножаем со знаком на ЕВХ;
В EDX:EAX результат, а т.к. умножались байты, то результат будет в ЕАХ.
Возврат из подпрограммы.
Оостальное должно быть понятно.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
20.03.2012, 16:56
общий
Адресаты:
В дебаггере в вашем варианте неправильно получается ответ, странно

ответ должен показываться на строчке - idiv ebx ?
давно
Посетитель
7438
7205
20.03.2012, 16:57
общий
Внес еще одну коррекцию во вторую программу:
Заменил в подпрограмме cube команду cwd на cwde, т.к.
первая делает расширение до пары dx:ax, а нам надо до eax, что и делает вторая команда
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.03.2012, 16:59
общий
Каким дебаггером смотрите?
И что показывает? Ответ будет после idiv ebx
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 17:05
общий
Адресаты:
Нет, соврал вам, там написано было 13, но так как 0013 в 16-ричной системе, то переводим и получаем 19, собственно наш ответ
давно
Посетитель
7438
7205
20.03.2012, 17:06
общий
Ну и славно
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 17:07
общий
Сейчас попробую мой переделанный вариант.

Неизвестный
20.03.2012, 17:10
общий
Адресаты:
А в моем варианте выдает 3 ошибки:


(26) Undefined symbol: X
(28) Undefined symbol: X
(28) Argument needs type override
давно
Посетитель
7438
7205
20.03.2012, 17:13
общий
Перепишите еще раз. Нет там символа Х
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 17:18
общий
Адресаты:
Странно, продолжает выдавать ошибки..
давно
Старший Модератор
31795
6196
20.03.2012, 17:19
общий
20.03.2012, 17:20
Код:
   mov   cx, ax
imul al
imul cx

Проверьте(перепишите), чтобы все буквы (С, Х, А) в операндах были латинские.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
20.03.2012, 17:20
общий
Тогда скопируйте сюда свой текст. Посмотрим...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.03.2012, 17:22
общий
Кстати, да. Если буковки C, A, B будут русскими, то вторая буква X приведет к указанной Вами ошибке...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 17:28
общий
Адресаты:
Да, все работает, моя ошибка признаю, спасибо вам огромное еще раз за работу.
давно
Посетитель
7438
7205
20.03.2012, 17:29
общий
Всегда пожалуйста. Заходите еще...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.03.2012, 17:30
общий
Адресаты:
Обязательно обращусь через пару недель...
Форма ответа