Умножение/деление больших чисел - Assembler

Узнай цену своей работы

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

Помогите с решением. Не могу понять в чём я косячу. Косяк на уровне умножения и деления. Подкорректируйте код, пожалуйста. F= (12563 / 78)+ X -(Y *2852)
Листинг программы
  1. masm
  2. Model small
  3. .386
  4. .stack 100h
  5. .data
  6. x db 3h
  7. y dw 4h
  8. f dw ?
  9. .code
  10. start:
  11. mov ax, @data
  12. mov ds,ax
  13. mov eax, 12563h
  14. mov ebx, 78h
  15. idiv ebx // (12563 / 78)
  16. mov bx, y
  17. mov cx, 2852h
  18. imu cx // (Y *2852)
  19. mov cx, bx
  20. mov al,x
  21. cbw
  22. cwd
  23. sub ecx, ebx
  24. add bx, ax
  25. mov f,bx
  26. mov ax, 4c00h
  27. int 21h
  28. end start

Решение задачи: «Умножение/деление больших чисел»

textual
Листинг программы
  1. mov eax,Y
  2. mov ebx,2852
  3. imul ebx;edx:eax=Y *2852
  4. mov esi,eax
  5. mov edi,edx
  6. mov eax,12563
  7. cdq; edx=0 or edx=-1
  8. mov ebx,78
  9. idiv ebx; eax=12563/78
  10. cdq
  11. add eax,X
  12. adc edx,0;edx:eax= (12563 / 78)+ X
  13. sub eax,esi
  14. sbb edx,edi;edx:eax= (12563 / 78)+ X -(Y *2852)

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

  1. Устанавливается значение переменной Y в регистр eax с помощью команды mov eax,Y.
  2. Устанавливается значение константы 2852 в регистр ebx с помощью команды mov ebx,2852.
  3. Выполняется умножение значения в регистре eax на значение в регистре ebx и результат сохраняется в регистрах edx и eax с помощью команды imul ebx;edx:eax=Y *2852.
  4. Значение переменной eax сохраняется в переменной esi с помощью команды mov esi,eax.
  5. Значение переменной edx сохраняется в переменной edi с помощью команды mov edi,edx.
  6. Значение константы 12563 устанавливается в регистр eax с помощью команды mov eax,12563.
  7. Выполняется знаковое расширение значения в регистре eax и результат сохраняется в регистрах edx и eax с помощью команды cdq; edx=0 or edx=-1.
  8. Значение константы 78 устанавливается в регистр ebx с помощью команды mov ebx,78.
  9. Выполняется деление значения в регистрах edx и eax на значение в регистре ebx и результат сохраняется в регистрах edx и eax с помощью команды idiv ebx; eax=12563/78.
  10. Выполняется знаковое расширение значения в регистре eax и результат сохраняется в регистрах edx и eax с помощью команды cdq.
  11. Значение переменной X прибавляется к значению в регистре eax с помощью команды add eax,X.
  12. Выполняется операция сложения с учётом заема с помощью команды adc edx,0.
  13. Из значения в регистрах edx и eax вычитается значение переменной esi с помощью команды sub eax,esi.
  14. Выполняется операция вычитания с учётом заема с помощью команды sbb edx,edi.
  15. Итоговый результат хранится в регистрах edx и eax и равен (12563 / 78) + X - (Y * 2852).

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


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

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

11   голосов , оценка 3.818 из 5

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

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

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