2016-04-02 4 views
0

ので、目標は次のとおりです。アセンブリ - 私はこのアセンブリに対応するCコードを書くことのためのjs対JA命令

0: 85 f6     test %esi,%esi 
2: 78 13     js  17 <part3+0x17> 
4: 83 fe 07    cmp $0x7,%esi 
7: 77 14     ja  1d <part3+0x1d> 
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx 
10: 48 d3 ff    sar %cl,%rdi 
13: 48 89 f8    mov %rdi,%rax 
16: c3      retq 
17: b8 00 00 00 00   mov $0x0,%eax 
1c: c3      retq 
1d: b8 00 00 00 00   mov $0x0,%eax 
22: c3      retq 

%のESIレジスタをテストする最初のループは前に終わるので、私は少し混乱しています2番目のループは終了します。

最初のループ内で%esiと7を比較する2番目のif文はありますか?またはこれはif if、else if situation ??

+1

ループはどこにもありません。ええ、それは 'if' /' else if'です。もちろん、それは返品です。あなたは 'else'は必要ありません。 – Jester

+1

'if(esi < 0 || esi > 7)return 0; return(int64_t)rdi >>(8 * esi); '? – EOF

+1

楽しい事実:両方のケースが同じ( 'return 0')なので、' ja'に 'js'が含まれているので、' js'を無視できます。 – Jester

答えて

2

すでに

0: 85 f6     test %esi,%esi 
2: 78 13     js  17 <part3+0x17> 

が、これは "もし(ESI < 0)後藤17;" であると言われているもの、私は総括してみましょう(ESI> 7)後藤あれば、これは「ある

4: 83 fe 07    cmp $0x7,%esi 
7: 77 14     ja  1d <part3+0x1d> 

1D; "

9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx 

"CX = 8 * RSI" //その明白ではないことだ "だけ" 乗算)

10: 48 d3 ff    sar %cl,%rdi 

rdi >> cl; 48 89 F8のmov%のRDIは、%RAX 16:それは同じ 13ですので、//はCXではないが、CXは< = 7 * 8であることを安全であるC3 retq

戻りRDIは、

17: b8 00 00 00 00   mov $0x0,%eax 
1c: c3      retq 

17:1D

1d: b8 00 00 00 00   mov $0x0,%eax 
22: c3      retq 

"0を返す":別の

を "0を返す" ようにC-コードは:

{ 
    if (esi < 0) return 0; 
    if (esi > 7) return 0; 
    return rdi >> (8 * rsi); 
} 

PS:2 " return 0 "(17と1d)は、Cコードで2つのifが1つに結合されていないことを明確に示します。
PSS:Cコードは明らかにではなく、は最適化でコンパイルされました。P

関連する問題