Assembly 为什么我会收到垃圾值?
我对汇编非常陌生,经过大量调试后,无法找到此错误的根源 我有以下汇编函数。目标是计算x的值。所有输入变量均为short类型,并具有以下值: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
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:谢谢你重新安排括号。真尴尬!