C

分支機操作碼是什麼意思(X86 架構)?

  • May 15, 2019

我有一個簡單的 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

位於。地址80484467e 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

請注意,所有值和數學都是十六進制的。

另外作為一個額外的注意事項,請注意,相對跳轉操作碼的操作數通常是有符號的。雖然在這兩個範例中它們只跳轉到前面,但它們也可以跳轉到以前的位置。

引用自:https://unix.stackexchange.com/questions/518764