Ошибка при вычислении выражения (Pascal+Assembler)
Формулировка задачи:
Здравствуйте, помогите написать программу на ассемблере встроенном в паскаль. Задание У=(2А^3-4А^2)/B^2. Необходима версия для знаковых и без знаковых чисел. Сам посидел. разобраться не смог. С виду просто а выдает не понятно что. судя по всему напутал что-то в регистрах. но не понимаю что.
вот код до которого смог дойти сам, в конце выдает ошибку "деление на ноль" как я понял, по причине того что результат не укладывается в байт. как исправить не знаю. да и почему так происходит тоже:
Листинг программы
- program qq;
- var A,B:byte;
- Y: word;
- Begin
- reabln (a,b);
- asm
- mov al, a
- imul a
- mov cx, ax
- mov al, a
- imul cx
- shl ax, 1
- mov bx, ax
- shl cx, 2
- xor ax, ax
- mov al, b
- imul b
- mov dx, ax
- mov ax, bx
- sub ah, ch
- sbb al, cl
- idiv dx
- mov y, ax
- ens;
- writeln (Y);
- end.
Решение задачи: «Ошибка при вычислении выражения (Pascal+Assembler)»
textual
Листинг программы
- mov al,b
- mul al; AX=b*b
- mov bx,ax
- xor cx,cx
- mov cl,a
- sub cx,2; CX=a-2
- mov al,a
- mul al; AX=a*a
- add ax,ax; AX=2*a*a
- mul cx; dx:ax=(a-2)*2*a*a
- div bx; ax=(a-2)*2*a*a/(b*b)
- mov y,ax
Объяснение кода листинга программы
- Переменная
al
содержит значениеb
, а переменнаяah
содержит значениеa
. - Результат умножения
al
наb
сохраняется вax
. - Переменная
bx
содержит значениеa*a
. - Переменная
cx
инициализируется значениемa
. - Результат вычитания
2
изcx
сохраняется вax
. - Переменная
al
снова содержит значениеa
. - Результат умножения
al
наa
сохраняется вax
. - Результат сложения
ax
наax
сохраняется вax
. - Результат умножения
cx
наax
сохраняется вdx:ax
. - Результат деления
ax
наbx
сохраняется вax
. - Переменная
y
инициализируется значениемax
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д