Ассемблерная вставка, реализующая вычитание - 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; }
Объяснение кода листинга программы
- Типы данных переменных:
- A, B, C, D, E: unsigned int8, int32, unsigned __int16
- A, B: byte, dword
- C: dword
- D: dword
- E: word
- Ввод значений переменных A, B, C с помощью функции scanf_s.
- Вычисление выражения 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
- Вычисление выражения 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
- Вывод значений переменных D и E с помощью функции printf.
- Использование функции _getch для приостановки выполнения программы до нажатия клавиши.
- Возврат значения 0 в конце функции main.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д