[英]What does assembly jmp offset <label+offset> mean?
我用了
objdump -M intel -d test
和
objdump -d test
用gcc 686-elf交叉編譯器反匯編一個非常簡單的for循環。 在這兩種情況下,我都會得到以下信息:
d: eb 11 jmp 20 <loop+0x20>
完整轉儲(INTEL)為:
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開始)偏移到偏移量20,則這是有意義的。
使我感到困惑的是語法。 為什么我有兩個20's?
20 <loop+0x20>
十六進制20
是跳轉目標地址。 loop+0x20
本來是有幫助的,但是在這種情況下不是很有用。 反匯編程序發現符號地址最接近20
。 在這種情況下,它是loop
。 它重新計算20
作為該標簽的偏移量。 由於標簽位於地址0
,因此簡化為0+0x20
,即20
,它等於您期望的目標。
此表示在其他設置中更有用。 例如,如果標簽a
代表int
s數組的基數,則<a+0x20>
將指定數組的第32個字節,即a[8]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.