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

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

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

Помогите с решением. Не могу понять в чём я косячу. Косяк на уровне умножения и деления. Подкорректируйте код, пожалуйста. F= (12563 / 78)+ X -(Y *2852)
masm
Model small
.386
.stack 100h
.data
x db 3h
y dw 4h
f dw ?
.code
start:
mov ax, @data
mov ds,ax
mov eax, 12563h
mov ebx, 78h
idiv ebx    // (12563 / 78)
mov bx, y
mov cx, 2852h
imu cx    // (Y *2852)
mov cx, bx
mov al,x
cbw
cwd
sub ecx, ebx
add bx, ax
mov f,bx
mov ax, 4c00h
int 21h
end start

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

textual
Листинг программы
mov eax,Y
mov ebx,2852
imul ebx;edx:eax=Y *2852
mov esi,eax
mov edi,edx
mov eax,12563
cdq; edx=0 or edx=-1
mov ebx,78
idiv ebx; eax=12563/78
cdq
add eax,X
adc edx,0;edx:eax= (12563 / 78)+ X
sub eax,esi
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