C
分支機操作碼是什麼意思(X86 架構)?
我有一個簡單的 c 程式碼,它被編譯,然後使用objdump實用程序提取文本程式碼。這是轉儲文件(一段轉儲文件):
0804841b <main>: 804841b: 8d 4c 24 04 lea 0x4(%esp),%ecx 804841f: 83 e4 f0 and $0xfffffff0,%esp 8048422: ff 71 fc pushl -0x4(%ecx) 8048425: 55 push %ebp 8048426: 89 e5 mov %esp,%ebp 8048428: 51 push %ecx 8048429: 83 ec 14 sub $0x14,%esp 804842c: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) 8048433: c7 45 f4 0a 00 00 00 movl $0xa,-0xc(%ebp) 804843a: 8b 45 f4 mov -0xc(%ebp),%eax 804843d: 01 45 f0 add %eax,-0x10(%ebp) 8048440: 8b 45 f0 mov -0x10(%ebp),%eax 8048443: 3b 45 f4 cmp -0xc(%ebp),%eax 8048446: 7e 0f jle 8048457 <main+0x3c> 8048448: 83 ec 0c sub $0xc,%esp 804844b: 6a 78 push $0x78 804844d: e8 be fe ff ff call 8048310 <putchar@plt> 8048452: 83 c4 10 add $0x10,%esp 8048455: eb 15 jmp 804846c <main+0x51> 8048457: 8b 45 f4 mov -0xc(%ebp),%eax 804845a: 3b 45 f0 cmp -0x10(%ebp),%eax 804845d: 7e 0d jle 804846c <main+0x51>
8048446
地址處的指令jle 8048457 <main+0x3c>
具有機器碼7e 0f
該
<main+0x3c>
語句是指目標指令從主地址移位的位置,即3c等於60,這意味著在從主地址移出60個字節後,該指令8048457: 8b 45 f4 mov -0xc(%ebp),%eax
位於。地址
8048446
為7e 0f
7e的指令的機器碼是jle的機器碼。0f是什麼?
在另一個這樣的分支指令中:
8048455: eb 15 jmp 804846c <main+0x51>
15是什麼意思?
Intel CPU 架構中存在絕對跳轉/程式碼分支和相對跳轉。
您向我們展示的是相對操作數操作碼跳轉。它們歷來被用來節省程式碼大小。
當你問什麼是 0f 時,它的意思是在目前正在執行的指令的末尾跳轉目前 PC + 0f。所以 8048448+0f = 8048457,因此彙編列表顯示
jle 8048457
(jle 表示如果低於或等於則跳轉)同樣,8048457+15 = 804846c,因此
jmp 804846c
請注意,所有值和數學都是十六進制的。
另外作為一個額外的注意事項,請注意,相對跳轉操作碼的操作數通常是有符號的。雖然在這兩個範例中它們只跳轉到前面,但它們也可以跳轉到以前的位置。