Исправить ошибку при вычислении выражения - Assembler
Формулировка задачи:
//Вариант 9 //A(byte), B(byte), C(dword). //Вычислить: D = (A*B)*B; E = (A - B)*(C - A) / B. #include <iostream> using namespace std; int main() { unsigned __int8 a; //byte unsigned __int8 b; //byte unsigned __int32 d,e; //dword unsigned __int8 z; unsigned __int32 c; //dword scanf_s("%d", &a); scanf_s("%d", &b); scanf_s("%d", &c); __asm { mov AL, a; //a в AL mul b; //AX=AL*b //a*b mov BL, b; mov BH, 0; //асширяем б до 16 mul BX; //DX:AX=a*b*b mov word ptr d + 0, ax; mov word ptr d + 2, dx; //=======E = (A - B)*(C - A) / B.======== //надо в дх:ах занести а-б mov al, a; //ax = a; sub al, b; //al = al - b; , где ал = а; mov dx, 0; mov ah, 0; //dx:ax = a-b; mov ebx, 0; mov bl, a; //ebx = a; sub c, ebx;// c = c - ebx; mov ebx, c; mul ebx; // edx:eax = dx:ax * ebx; mov ebx, 0; mov bl, b; //ebx = b; div ebx; //dx:ax = e; mov word ptr e + 0, ax; mov word ptr e + 2, dx; }; //printf("%d", a); //printf("%d", b); printf("%d", e); system("pause"); return 0; }
это ассемблерная вставка на си
точней она работает, но только если нету остатка от деления
Решение задачи: «Исправить ошибку при вычислении выражения»
textual
Листинг программы
mov al, a; sub al, b; mov dx, 0; mov ah, 0; mov ebx, 0; mov bl, a; sub c, ebx; mov ebx, c; mul ebx; mov ebx, 0; mov bl, b; idiv ebx; mov e, eax;
Объяснение кода листинга программы
- mov al, a;
Означает перемещение значения переменной
a
в регистрal
. - sub al, b;
Выполняет вычитание значения переменной
b
из значения переменнойa
и сохраняет результат в регистреal
. - mov dx, 0;
Перемещает значение 0 в регистр
dx
. - mov ah, 0;
Перемещает значение 0 в регистр
ah
. - mov ebx, 0;
Перемещает значение 0 в регистр
ebx
. - mov bl, a;
Перемещает значение переменной
a
в регистрbl
. - sub c, ebx;
Вычитает значение переменной
c
из значения регистраebx
и сохраняет результат в регистреebx
. - mov ebx, c;
Перемещает значение переменной
c
в регистрebx
. - mul ebx;
Выполняет умножение значения регистра
ebx
на значение в регистреeax
и сохраняет результат в регистреeax
. - mov ebx, 0;
Перемещает значение 0 в регистр
ebx
. - mov bl, b;
Перемещает значение переменной
b
в регистрbl
. - idiv ebx;
Выполняет деление значения регистра
eax
на значение регистраebx
и сохраняет частное в регистреeax
и остаток в регистреedx
. - mov e, eax;
Перемещает значение регистра
eax
в переменнуюe
.