Посчитать значение выражения - 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;

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

  1. Переменная z используется для получения значения выражения, которое затем будет вычислено.
  2. Команда cbw используется для расширения регистра AL до регистра AX, чтобы можно было использовать его в операциях с регистром AX.
  3. Значение выражения Z+4 не сохраняется нигде, что может вызвать проблемы в других частях программы.
  4. Переменная x используется как байт, но это не учитывается в коде.
  5. Команда cbw снова используется для расширения регистра AL до регистра AX, хотя она уже была использована ранее.
  6. Значение выражения 7(x-2) вычитается из регистра AX.
  7. Переменная y используется как байт, но это не учитывается в коде.
  8. Регистры AX и BX используются для выполнения операции сложения, но это может привести к переполнению.
  9. Команда idiv ax используется для деления регистра AX на значение выражения 7(x-2), но это может привести к переполнению.
  10. Значение 1 получается в результате вычисления выражения 7(x-2) деленного на 7(x-2).
  11. Значение 1 отнимается от регистра AL, что приводит к значению 0 в регистре AL.
  12. Переменная v используется для сохранения значения регистра AL, которое равно 0.

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


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

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

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