Вычислить значение выражения: ((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
Листинг программы
  1. procedure TForm1.BitBtn1Click(Sender: TObject);
  2. var
  3. c:word;
  4. begin
  5. asm
  6. // умножение 2 на 10
  7. mov al,2
  8. mov cl,10
  9. imul cl
  10. mov bl,al
  11. //деление 30 на 3
  12. mov ax,30
  13. mov cl,3
  14. div cl
  15. mov dl,al
  16. // подсчёт числителя
  17. sub bl,dl
  18. // деление 20 на 4
  19. mov ax,20
  20. mov cl,4
  21. div cl
  22. mov dl,al
  23. //разница 10 и предыдущего слагаемого
  24. mov al,10
  25. sub al,dl
  26. // подсчёт знаменателя
  27. idiv bl
  28. // передача значения переменной
  29. mov c,bl
  30. end;
  31. form1.Edit1.text:=inttostr(c);
  32. end;
Сама ошибка - [Error] Unit1.pas(58): Operand size mismatch , выводится на mov c,bl , видимо ошибся в регистрах где-то, прошу указать на ошибку и подсказать как мне вывести значение, выводится в Edit1. Так же готов выслушать советы по оптимизации, возможно где-то сделал лишние операции.

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

textual
Листинг программы
  1.     ;((2*c)-(d/3))
  2.     mov eax, c
  3.     mov ebx, 2
  4.     imul ebx
  5.     push eax
  6.     push edx
  7.  
  8.     mov  eax, d
  9.     cdq
  10.     mov  ebx, 3
  11.     idiv ebx
  12.     cdq
  13.  
  14.     pop  ebx
  15.     pop  ecx
  16.     sub  ecx, eax
  17.     sbb  ebx, edx
  18.     push ecx
  19.     push ebx
  20.  
  21.     ;(b-(a/4))
  22.     mov  eax, a
  23.     cdq
  24.     mov  ebx, 4
  25.     idiv ebx
  26.     mov  ebx, b
  27.     sub  ebx, eax
  28.  
  29.     ;((2*c)-(d/3)) / (b-(a/4))
  30.     pop  edx
  31.     pop  eax
  32.     idiv ebx
  33.  
  34.     mov r, eax

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

  1. Значение переменной c перемещается в регистр eax.
  2. Значение переменной 2 перемещается в регистр ebx.
  3. Производится умножение значений в регистрах eax (c) и ebx (2), результат сохраняется в edx и eax.
  4. Значение edx (старшая половина результата умножения) помещается в стек.
  5. Значение eax (младшая половина результата умножения) помещается в стек.
  6. Значение переменной d перемещается в регистр eax.
  7. Расширение знака знакового числа в регистре eax до edx:eax (размещая старшую половину в edx и младшую половину в eax).
  8. Значение переменной 3 перемещается в регистр ebx.
  9. Производится деление значений в edx:eax (d) на ebx (3), результат сохраняется в edx и eax.
  10. Расширение знака знакового числа в регистре eax до edx:eax (размещая старшую половину в edx и младшую половину в eax).
  11. Старшая половина результата умножения извлекается из стека и помещается в регистр ebx.
  12. Младшая половина результата умножения извлекается из стека и помещается в регистр ecx.
  13. Выполняется вычитание значения eax (результат деления d на 3) из значения ecx (его доминантная половина).
  14. Выполняется заимствование (borrow) значения edx (результата деления d на 3) из значения ebx (его резидуальная половина).
  15. Результат вычитания (полное число) помещается в стек.
  16. Значение переменной a перемещается в регистр eax.
  17. Расширение знака знакового числа в регистре eax до edx:eax (размещая старшую половину в edx и младшую половину в eax).
  18. Значение переменной 4 перемещается в регистр ebx.
  19. Производится деление значений в edx:eax (a) на ebx (4), результат сохраняется в edx и eax.
  20. Значение переменной b перемещается в регистр ebx.
  21. Выполняется вычитание значения eax (результат деления a на 4) из значения ebx.
  22. Результат вычитания помещается в регистр ebx.
  23. Старшая половина результата умножения извлекается из стека и помещается в регистр edx.
  24. Младшая половина результата умножения извлекается из стека и помещается в регистр eax.
  25. Выполняется деление значения eax (результат операции ((2*c)-(d/3))) на значение ebx (результат операции (b-(a/4))).
  26. Результат деления сохраняется в переменную r.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут