Умножение/деление больших чисел - 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д