Ассемблерная вставка, реализующая вычитание - Assembler

Узнай цену своей работы

Формулировка задачи:

вообщем вот
#include <stdio.h> // необходим для работы printf
#include <conio.h> // необходим для работы _getch();
#include <iostream>
int main()
{
    unsigned __int32 c, d; //4 байт dword пложительные
    unsigned __int8 a, b;
    unsigned short int e;
 
    scanf_s("%d", &a);
    scanf_s("%d", &b);
    scanf_s("%d", &c);
    __asm
    {
        //3) A (byte), B (byte), C (dword).
        //Вычислить: D = (C - A) / B; E = (A*b) + B
        //byte 1 байт - 8
        //word 2 байта  - 16
        //dwrd 4 байта - 32
        mov al, a;
        mul b; //ax = al*b; ax(16) 
        mov e, ax; //e = ax;
        mov al, b; //al = b;
        mov ah, 0; // ax = b;
        add e, ax; //e = e + ex;
        //======================
        //а преобразуем в 32
 
        mov ax, word ptr c + 0;
        mov dx, word ptr c + 2;
        mov bh, 0;
        mov bl, a;
 
        sub ax, bx;
        sbb dx, 0;
        
        mov d, ; ;

    };
    printf("%d ", e);
    printf("%d", c);
    _getch();
    return 0;
}
первая половина есть, осталось найти с

Решение задачи: «Ассемблерная вставка, реализующая вычитание»

textual
Листинг программы
#include <conio.h> 
#include <stdio.h> 
#include <iostream> 
 
//A (byte), B (byte), C (dword). 
//Вычислить: D = (C-A)/B; 
//E = (A*B)+B. 
 
int main()
{
    unsigned __int8 A, B;
    unsigned __int16 E;
    __int32 D, C;
 
    scanf_s("%d", &A);
    scanf_s("%d", &B);
    scanf_s("%d", &C);
    
 
    __asm
    {   //====================
        //E = (A*B)+B. 
        mov al, A;
        mul B; //ax= al*b 
        mov E, ax; //E=ax= al*b 
        mov al, B;
        mov ah, 0;
        add E, ax;
        //====================
        //D = (C-A)/B; 
        mov bl, B;
        mov bh, 0;
 
        mov ax, word ptr C;
        mov dx, word ptr C + 2;
        sub al, A;
        sbb ah, 0;
        sbb dx, 0;
 
        idiv bx;//ax=(dx;ax)/b 
 
        mov word ptr D, ax;
        mov word ptr D + 1, ax;
    }
 
    printf("D = %d\n", D);
    printf("E = %d", E);
    _getch();
    return 0;
}

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

  1. Типы данных переменных:
    • A, B, C, D, E: unsigned int8, int32, unsigned __int16
    • A, B: byte, dword
    • C: dword
    • D: dword
    • E: word
  2. Ввод значений переменных A, B, C с помощью функции scanf_s.
  3. Вычисление выражения E = (A*B)+B:
    • mov al, A: перенос значения A в регистр al
    • mul B: умножение значения al на значение B, результат сохраняется в регистрах ax и dx
    • mov E, ax: перенос результата умножения в переменную E
    • mov al, B: перенос значения B в регистр al
    • mov ah, 0: перенос значения 0 в регистр ah
    • add E, ax: сложение значения ax с значением E, результат сохраняется в E
  4. Вычисление выражения D = (C-A)/B:
    • mov bl, B: перенос значения B в регистр bl
    • mov bh, 0: перенос значения 0 в регистр bh
    • mov ax, word ptr C: перенос значения C в регистры ax и dx
    • mov dx, word ptr C + 2: перенос значения C+2 в регистр dx
    • sub al, A: вычитание значения A из значения al, результат сохраняется в al
    • sbb ah, 0: вычитание значения 0 из значения ah, результат сохраняется в ah
    • sbb dx, 0: вычитание значения 0 из значения dx, результат сохраняется в dx
    • idiv bx: деление значения dx на значение bl, результат сохраняется в ax и dx
    • mov word ptr D, ax: перенос результата деления в переменную D
    • mov word ptr D + 1, ax: перенос второго результата деления в переменную D
  5. Вывод значений переменных D и E с помощью функции printf.
  6. Использование функции _getch для приостановки выполнения программы до нажатия клавиши.
  7. Возврат значения 0 в конце функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

12   голосов , оценка 4 из 5
Похожие ответы