Не могу разобраться с делением long int - Assembler
Формулировка задачи:
Здравствуйте уважаемые знатоки.
при решении задачи никак не получается разделить двойное слово на байт.помогите пожалуйста разобраться.
пример:
b) A (longint)
B (byte)
C (integer)
вычислить
D = (A/B)*C
E = (C^2/B)-A
не получается именно первое действие A/B. уже весь интернет перекопал,ничего найти не могу
пример кода:
#include "stdafx.h" #include "iostream" int _tmain(int argc, _TCHAR* argv[]) { long int A = 10, D, E; char B = 5; short int C = 4; /* D = (A/B)*c E = (A+B)+B */ __asm { mov eax, A; mov cl, B; cbw; cwd; IDIV CX; mov D,eax } printf("\n%d", D); getchar(); return 0; }
Решение задачи: «Не могу разобраться с делением long int»
textual
Листинг программы
org 100h mov ebx,[Divisor] ; movsx, если делим на байт mov eax,dword [Dividend+4] mov ecx,dword [Dividend] cdq idiv ebx bt eax,31 sbb eax,0 ; вычитаем единицу, если EAX отрицательный xchg ecx,eax idiv ebx ; результат в ECX:EAX, остаток в EDX Dividend dq 3 ; делимое Divisor dd 2 ; делитель
Объяснение кода листинга программы
Список элементов:
- org 100h — начало выполнения программы
- mov ebx,[Divisor] — перемещение делителя в регистр ebx
- mov eax,dword [Dividend+4] — перемещение старших 4 байт делимого в регистр eax
- mov ecx,dword [Dividend] — перемещение младших 4 байт делимого в регистр ecx
- cdq — преобразование 32-битного целого числа в 64-битное с учётом знака
- idiv ebx — деление ecx на ebx с учётом знака
- bt eax,31 — получение младшего бита результата
- sbb eax,0 — вычитание единицы, если EAX отрицательный
- xchg ecx,eax — обмен ecx и eax
- idiv ebx — деление ecx на ebx с учётом знака
- результат в ECX:EAX, остаток в EDX Dividend — делимое, равно 3 Divisor — делитель, равно 2
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д