如何在寄存器 - 汇编语言中加载负值

时间:2012-11-23 14:52:33

标签: c++ assembly inline-assembly

说我有以下代码:

下面的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?

3 个答案:

答案 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。一个是签名比较,另一个是无符号比较。