Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么我会收到垃圾值?_Assembly_X86 - Fatal编程技术网

Assembly 为什么我会收到垃圾值?

Assembly 为什么我会收到垃圾值?,assembly,x86,Assembly,X86,我对汇编非常陌生,经过大量调试后,无法找到此错误的根源 我有以下汇编函数。目标是计算x的值。所有输入变量均为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

我对汇编非常陌生,经过大量调试后,无法找到此错误的根源

我有以下汇编函数。目标是计算x的值。所有输入变量均为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
接收垃圾值?

不是
bx
接收垃圾,而是
AX
接收垃圾。您在内存中计算denom,但忘记将其重新加载到DX:AX中作为
idiv
的红利

请注意,对于
IDIV
,在
DX
AX
中都需要一个有效值:

#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;
}
#包括
短a=3;
短b=1;
短c=1;
短d=1;
短e=-2;
短f=5;
短x,numer,denom;
//(a*e-b*d)/(c*e-b*f)
void计算_x()
{
__asm
{
莫瓦克斯,c
伊穆勒
移动数
莫瓦克斯,b
伊穆尔f
分号
mov-ax,a
伊穆勒
莫夫德诺姆
莫瓦克斯,b
伊穆尔d
副名词
movsx eax,denom
cwd
mov bx,编号
idiv bx
mov x,ax
}
}
int main()
{
看跌期权(“(a*e-b*d)/(c*e-b*f)”;
计算_x();
printf(“%d/%d=%d”,名称,数字,x);
//请注意,分子和分母命名错误。
//我们真的在计算数字
返回0;
}

如何声明这些文件的静态存储?你有没有可能把尺码弄错了?很明显,您使用的是MASM或其他东西,而不是NASM,否则,
imulf
将是一个不明确的操作数大小。所以
mov bx,numer
没有将地址放入寄存器。不管怎样,垃圾值是多少?它看起来像地址吗?低字节是否正确,高字节是否正确?没有这些信息,这不是一个好消息。在DX:AX中,idiv bx之前的值是多少?您有意将32位
imul
结果保留在DX:AX中,对吗?而不是16位/16位除法。还有,你为什么要除以分子?我想那就是
numer
是什么?除法是商=分子/分母。(为什么要在idiv之前将
numer
加载到
bx
中?这只是为了调试吗?x86有8个或16个寄存器;用它们代替内存。)@PeterCordes感谢您的回复。变量在C++中用<代码>声明:a,b,c,d,e,f,x,y;<代码>。我相信这是MASM,因为我的所有汇编代码都在C++文件中内嵌。我正在使用uuasm{}风格,并在VisualStudio中进行开发。我有一个几乎相同的函数来计算一个
y
变量,它工作得很好。所以你所有的变量都是全局变量?你仍然忽略了它们,以及你如何设置它们,所以这仍然不是一个问题。没有人可以复制/粘贴此内容并在自己的计算机上尝试。您仍然忽略了实际得到的值
bx
。(顺便说一句,您的编译器正在生成一个32位可执行文件。MSVC只支持其在32位模式下笨拙的内联asm语法。)
numer
在第一个指令块之后是否具有预期值
c*e-b*f
?我看不出你的代码有任何正确性问题,只是像初学者代码一样效率低下,所以问题可能在别处。@PeterCordes:谢谢你重新安排括号。真尴尬!