Вычислить значение выражения: ((2*c)-(d/3)) / (b-(a/4)) - Assembler

Формулировка задачи:

Имеется пример ((2*c)-(d/3)) / (b-(a/4)) При клике на Btn1 значение выводится в Edit1 В качестве тестовых чисел я взял: a - 20 b - 10 c - 10 d - 30.Итоговый ответ должен получиться (20-(30/3))/(10-(20/4))=10/5=2 Использую ассемблерную вставку в Delphi
procedure TForm1.BitBtn1Click(Sender: TObject);
var
c:word;
begin
  asm
  // умножение 2 на 10
  mov al,2
  mov cl,10
  imul cl
  mov bl,al
  
  //деление 30 на 3
  mov ax,30
  mov cl,3
  div cl
  mov dl,al
 
  // подсчёт числителя
  sub bl,dl
 
  // деление 20 на 4
  mov ax,20
  mov cl,4
  div cl
  mov dl,al
 
  //разница 10 и предыдущего слагаемого
  mov al,10
  sub al,dl
 
  // подсчёт знаменателя
  idiv bl
 
  // передача значения переменной
  mov c,bl
  end;
  form1.Edit1.text:=inttostr(c);
end;
Сама ошибка - [Error] Unit1.pas(58): Operand size mismatch , выводится на mov c,bl , видимо ошибся в регистрах где-то, прошу указать на ошибку и подсказать как мне вывести значение, выводится в Edit1. Так же готов выслушать советы по оптимизации, возможно где-то сделал лишние операции.


textual

Код к задаче: «Вычислить значение выражения: ((2*c)-(d/3)) / (b-(a/4)) - Assembler»

    ;((2*c)-(d/3))
    mov eax, c
    mov ebx, 2
    imul ebx
    push eax
    push edx
 
    mov  eax, d
    cdq
    mov  ebx, 3
    idiv ebx
    cdq
 
    pop  ebx
    pop  ecx
    sub  ecx, eax
    sbb  ebx, edx
    push ecx
    push ebx
 
    ;(b-(a/4))
    mov  eax, a
    cdq
    mov  ebx, 4
    idiv ebx
    mov  ebx, b
    sub  ebx, eax
 
    ;((2*c)-(d/3)) / (b-(a/4))
    pop  edx
    pop  eax
    idiv ebx
 
    mov r, eax
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

13   голосов, оценка 4.077 из 5

Источник
Похожие ответы