Умножение/деление больших чисел - 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).