说我有以下代码:
下面的C ++代码和内联汇编代码:
等式:
X=40+5
Y=3*12 ---> X=45 Y=36
测试
if x < y - print
x+y
else
print x-y
int main()
{
int x=5,y=3,z=0;
x=x+40;
y=y*12;
if(x<y) //45<36 - cond. is NOT met
z=x+y;
else
z=x-y;
cout << "z:" << z << endl; // z=9
x=5,y=3,z=0;
__asm
{
pushad
mov eax,0
mov ebx,0
mov eax,x
add eax,40
mov ebx,y
imul ebx,12
cmp eax,ebx
jb First ;cond is NOT met
jmp Second ;we jump to Second label
First: add eax,ebx
mov z,eax
Second: sub eax,ebx
mov z,eax
popad
}
cout << "z:" << z << endl; //z=9
return 0;
}
两个结果都产生z = 9,但是如果我分别在C ++和汇编代码中改变y = -3
(int x=5,y=-3,z=0;
AND x=5,y=-3,z=0;
)我必须得到z = 81,但是内联汇编的输出是z = 45,所以我不能在ebx寄存器中加载neg值(-3)正确...
我的问题是如何在ebx中加载-3,这样我得到45 - ( - 36)= 81?
答案 0 :(得分:3)
我认为你遇到的问题是jb
使用了无符号比较;您可能希望改为使用jl
。
答案 1 :(得分:2)
两个问题 - 正如其他人所指出的那样,一个问题是你使用了基于无符号比较的分支指令。
另一个是,在执行First
中的代码之后,然后执行Second
中的代码。您通常希望在jmp
之后拥有无条件Second
。此时,您添加然后再次立即减去。
所以你可能想要:
cmp eax,ebx
jge Second ;cond is not met (I've removed one branch and reversed the test)
First: add eax,ebx
jmp Store
Second: sub eax,ebx
Store: mov z,eax ;shared by both paths
答案 2 :(得分:1)
使用JL
代替JB
。一个是签名比较,另一个是无符号比较。