0

私は次のコードを持っていると言います:

以下の 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 であるため、できません負の値(-3)をebxレジスタに適切にロードします...私の質問は、どうすればebxに-3をロードして、45-(-36)= 81を取得できますか?

4

3 に答える 3

3

あなたが抱えている問題jbは、符号なしの比較を使用していることだと思います。jlおそらく代わりに使用したいでしょう。

于 2012-11-23T15:06:43.137 に答える
2

2 つの問題 - 1 つは、他の人が指摘したように、符号なしの比較に基づいて分岐命令を使用したことです。

もう 1 つは、 のコードを実行した後、 のコードをFirst実行することですSecond。通常、無条件のjmpafterが必要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
于 2012-11-23T15:11:23.350 に答える
1

JLの代わりに使用しJBます。1 つは符号付き比較で、もう 1 つは符号なし比較です。

于 2012-11-23T15:07:07.757 に答える