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

C++ 如何在寄存器汇编语言中加载负值,c++,assembly,inline-assembly,C++,Assembly,Inline Assembly,假设我有以下代码: C++代码和内联汇编代码如下: 方程式: X=40+5 Y=3*12 ---> X=45 Y=36 试验 如果x

假设我有以下代码:

C++代码和内联汇编代码如下:

方程式:

X=40+5 
Y=3*12 ---> X=45 Y=36
试验

如果x

else
打印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;
}
intmain()
{   
int x=5,y=3,z=0;
x=x+40;
y=y*12;

如果(x我想你的问题是
jb
使用无符号比较;你可能想用
jl
代替。

我想你的问题是
jb
使用无符号比较;你可能想用
jl
代替
jb
。一个是有符号的e、 另一个是无符号比较。

使用
JL
而不是
JB
。一个是有符号比较,另一个是无符号比较。

两个问题-一个是,正如其他人指出的,您使用了基于无符号比较的分支指令

另一个是,在第一次执行
中的代码后,然后在第二次执行
中的代码。您通常希望在第二次执行
后有一个无条件的
jmp
。此时,您可以进行添加,然后立即再次进行减法

所以你可能想要:

        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

有两个问题-一个是,正如其他人指出的,您使用了基于无符号比较的分支指令

另一个是,在第一次执行
中的代码后,然后在第二次执行
中的代码。您通常希望在第二次执行
后有一个无条件的
jmp
。此时,您可以进行添加,然后立即再次进行减法

所以你可能想要:

        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

“mov ebx,-3”?或者我在这里遗漏了什么…“mov ebx,-3”?或者我在这里遗漏了什么…谢谢大家!感谢你们的回答!谢谢大家!感谢你们的回答!