Почему я получаю мусорное значение? - PullRequest
0 голосов
/ 19 сентября 2018

Я очень новичок в Assembly и не могу найти источник этой ошибки после большого количества отладок.

У меня есть следующая функция Assembly.Цель состоит в том, чтобы вычислить значение х.Все входные переменные имеют тип short и имеют значения:

a = 3
b = 1
c = 1
d = 1
e = -2
f = 5

Функция:

void calculate_x()
{
    __asm
    {
        mov     ax, c
        imul    e
        mov     numer, ax
        mov     ax, b
        imul    f
        sub     numer, ax

        mov     ax, a
        imul    e
        mov     denom, ax
        mov     ax, b
        imul    d
        sub     denom, ax

        mov     bx, numer
        idiv    bx
        mov     x, ax
    }
}

Я получаю результат x = 0, но он должен быть x = 1.

Когда я устанавливаю точки останова, кажется, что проблема заключается в третьей от последней строки mov bx, numer.Это приводит к bx получению значения мусора, но оно должно получить значение -7.

Почему bx получает значение мусора?

1 Ответ

0 голосов
/ 19 сентября 2018

Не BX получает мусор, AX делает это.Вы рассчитываете деном в памяти, но забыли перезагрузить его в DX: AX в качестве дивиденда для idiv.

Обратите внимание, что вам нужно действительное значение в DX и AX для IDIV:

#include <stdio.h>

short a = 3;
short b = 1;
short c = 1;
short d = 1;
short e = -2;
short f = 5;

short x, numer, denom;

// (a*e - b*d) / (c*e - b*f)

void calculate_x()
{
    __asm
    {
        mov     ax, c
        imul    e
        mov     numer, ax
        mov     ax, b
        imul    f
        sub     numer, ax

        mov     ax, a
        imul    e
        mov     denom, ax
        mov     ax, b
        imul    d
        sub     denom, ax

        movsx   eax, denom
        cwd
        mov     bx, numer
        idiv    bx
        mov     x, ax
    }
}

int main()
{
    puts ("(a*e - b*d) / (c*e - b*f)");
    calculate_x();
    printf("%d / %d = %d", denom, numer, x);
    // note that numerator and denominator are misnamed.
    // we really are calculating denom / numer
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...