2016-07-02 15 views
1

Iは、GCC 686-ELFクロスコンパイラでループのための非常に簡単に分解するアセンブリjmpオフセット<label + offset>はどういう意味ですか?

objdump -M intel -d test 

objdump -d test 

を用います。私どちらの場合も、私は次を得る:

d: eb 11     jmp 20 <loop+0x20> 

完全なダンプ(インテル)がある:20を相殺するためにジャンプした場合

00000000 <loop>: 
0: 55      push ebp 
1: 89 e5     mov ebp,esp 
3: 83 ec 10    sub esp,0x10 
6: c7 45 fc 00 00 00 00 mov DWORD PTR [ebp-0x4],0x0 
d: eb 11     jmp 20 <loop+0x20> 
f: a1 00 00 00 00   mov eax,ds:0x0 
14: 83 c0 01    add eax,0x1 
17: a3 00 00 00 00   mov ds:0x0,eax 
1c: 83 45 fc 01    add DWORD PTR [ebp-0x4],0x1 
20: 83 7d fc 09    cmp DWORD PTR [ebp-0x4],0x9 
24: 7e e9     jle f <loop+0xf> 
26: 90      nop 
27: c9      leave 
28: c3      ret 

これは理にかなって、0であるラベルのループから

私は構文が混乱しています。なぜ私は2つの20を持っていますか?

+1

「jmp」は相対的なものであり、絶対的なものではないことに注意してください。だから、アドレスではなく*オフセット*です。 –

+0

私はそれを修正します。ありがとうございました。 – Makketronix

+0

それはどのようにそのオフセットに到着したかを伝えています。 –

答えて

2

16進数20がジャンプ先アドレスです。 loop+0x20は役に立ちますが、この場合はあまり役に立ちません。逆アセンブラは、20に最も近い象徴的なアドレスを見つけました。この場合はloopです。そのラベルからのオフセットとして20を再計算しました。ラベルはアドレス0にあるので、これは0+0x20に簡略化されます。これは20です。これは予想通りです。

この表現は、他の設定で役立ちます。たとえば、ラベルaが配列の基数がintの場合、<a+0x20>は配列の32番目のバイトを指定し、a[8]となります。