Исправить ошибку при вычислении выражения - 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;

Объяснение кода листинга программы

  1. mov al, a; Означает перемещение значения переменной a в регистр al.
  2. sub al, b; Выполняет вычитание значения переменной b из значения переменной a и сохраняет результат в регистре al.
  3. mov dx, 0; Перемещает значение 0 в регистр dx.
  4. mov ah, 0; Перемещает значение 0 в регистр ah.
  5. mov ebx, 0; Перемещает значение 0 в регистр ebx.
  6. mov bl, a; Перемещает значение переменной a в регистр bl.
  7. sub c, ebx; Вычитает значение переменной c из значения регистра ebx и сохраняет результат в регистре ebx.
  8. mov ebx, c; Перемещает значение переменной c в регистр ebx.
  9. mul ebx; Выполняет умножение значения регистра ebx на значение в регистре eax и сохраняет результат в регистре eax.
  10. mov ebx, 0; Перемещает значение 0 в регистр ebx.
  11. mov bl, b; Перемещает значение переменной b в регистр bl.
  12. idiv ebx; Выполняет деление значения регистра eax на значение регистра ebx и сохраняет частное в регистре eax и остаток в регистре edx.
  13. mov e, eax; Перемещает значение регистра eax в переменную e.

Оцени полезность:

11   голосов , оценка 4 из 5