Посчитать значение выражения - Assembler
Формулировка задачи:
не могу понять в чём ошибка, не правильно компилируется
посчитать значение выражения (7*(x-2)+y)/(z+4)-1), x,z – байты, y,ν - слова, при:
x=-1h, y=13h, z=-2h
x=-7Eh, y=4FBAh, z=7Fh
для проверки:
x=-1h, y=13h, z=-2h, ν=-2n
x=-7Eh, y=4FBAh, z=7Fh, ν=93n
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> #include <windows.h> #include <tchar.h> short int am(short int x, char y, short int z) { short int v = 0; _asm { mov al, z; cbw; add al, 4; mov ax, x; cbw; sub ax, 2; imul ax, 7; mov bx, y; add ax, bx; idiv ax; sub al , 1; mov v, al; } return v; } int main() { setlocale(LC_ALL, "rus"); short int x, z, y, v; x = -1; y = 19; z = -2; printf(" Получаемое значение (си) в 16-ой v=%hd \n", ((7 * (x - 2) + y) / (z + 4) - 1)); printf(" Получаемое значение (си) в 10-ой v=%d \n", ((7 * (x - 2) + y) / (z + 4) - 1)); v = am(x, y, z); printf(" Получаемое значение (ассемблер) v=%x \n", v); x = -126; y = 20410; z = 127; printf(" Получаемое значение (си) в 16-ой v=%hd \n", ((7 * (x - 2) + y) / (z + 4) - 1)); printf(" Получаемое значение (си) в 10-ой v=%d \n", ((7 * (x - 2) + y) / (z + 4) - 1)); v = am(x, y, z); printf(" Получаемое значение (ассемблер) v=%x \n", v); return 0; }
Решение задачи: «Посчитать значение выражения»
textual
Листинг программы
mov al, z; cbw;для чего расширять AL до AX если ниже прибавляем к AL, а про АН забываем add al, 4;а дальше нужно поместить Z+4 куда-то но мы об этом забыли mov ax, x;x – байт, но об этом забыли cbw;смысл выполнения этой команды? sub ax, 2; imul ax, 7;АХ=7(х-2) mov bx, y; add ax, bx;просто сложить АХ и Y нельзя? idiv ax;что у нас в DX? Делим 7(x-2) на 7(x-2) результатом будет 1 sub al , 1; от 1 отняли 1, что будет в результате? mov v, al;
Объяснение кода листинга программы
- Переменная
z
используется для получения значения выражения, которое затем будет вычислено. - Команда
cbw
используется для расширения регистра AL до регистра AX, чтобы можно было использовать его в операциях с регистром AX. - Значение выражения
Z+4
не сохраняется нигде, что может вызвать проблемы в других частях программы. - Переменная
x
используется как байт, но это не учитывается в коде. - Команда
cbw
снова используется для расширения регистра AL до регистра AX, хотя она уже была использована ранее. - Значение выражения
7(x-2)
вычитается из регистра AX. - Переменная
y
используется как байт, но это не учитывается в коде. - Регистры AX и BX используются для выполнения операции сложения, но это может привести к переполнению.
- Команда
idiv ax
используется для деления регистра AX на значение выражения7(x-2)
, но это может привести к переполнению. - Значение 1 получается в результате вычисления выражения
7(x-2)
деленного на7(x-2)
. - Значение 1 отнимается от регистра AL, что приводит к значению 0 в регистре AL.
- Переменная
v
используется для сохранения значения регистра AL, которое равно 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д