Умножение/деление больших чисел - 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)
Объяснение кода листинга программы
- Устанавливается значение переменной
Y
в регистрeax
с помощью командыmov eax,Y
. - Устанавливается значение константы
2852
в регистрebx
с помощью командыmov ebx,2852
. - Выполняется умножение значения в регистре
eax
на значение в регистреebx
и результат сохраняется в регистрахedx
иeax
с помощью командыimul ebx;edx:eax=Y *2852
. - Значение переменной
eax
сохраняется в переменнойesi
с помощью командыmov esi,eax
. - Значение переменной
edx
сохраняется в переменнойedi
с помощью командыmov edi,edx
. - Значение константы
12563
устанавливается в регистрeax
с помощью командыmov eax,12563
. - Выполняется знаковое расширение значения в регистре
eax
и результат сохраняется в регистрахedx
иeax
с помощью командыcdq; edx=0 or edx=-1
. - Значение константы
78
устанавливается в регистрebx
с помощью командыmov ebx,78
. - Выполняется деление значения в регистрах
edx
иeax
на значение в регистреebx
и результат сохраняется в регистрахedx
иeax
с помощью командыidiv ebx; eax=12563/78
. - Выполняется знаковое расширение значения в регистре
eax
и результат сохраняется в регистрахedx
иeax
с помощью командыcdq
. - Значение переменной
X
прибавляется к значению в регистреeax
с помощью командыadd eax,X
. - Выполняется операция сложения с учётом заема с помощью команды
adc edx,0
. - Из значения в регистрах
edx
иeax
вычитается значение переменнойesi
с помощью командыsub eax,esi
. - Выполняется операция вычитания с учётом заема с помощью команды
sbb edx,edi
. - Итоговый результат хранится в регистрах
edx
иeax
и равен(12563 / 78) + X - (Y * 2852)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д