Ошибка при вычислении выражения (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

Объяснение кода листинга программы

  1. Переменная al содержит значение b, а переменная ah содержит значение a.
  2. Результат умножения al на b сохраняется в ax.
  3. Переменная bx содержит значение a*a.
  4. Переменная cx инициализируется значением a.
  5. Результат вычитания 2 из cx сохраняется в ax.
  6. Переменная al снова содержит значение a.
  7. Результат умножения al на a сохраняется в ax.
  8. Результат сложения ax на ax сохраняется в ax.
  9. Результат умножения cx на ax сохраняется в dx:ax.
  10. Результат деления ax на bx сохраняется в ax.
  11. Переменная y инициализируется значением ax.

Оцени полезность:

14   голосов , оценка 4.071 из 5