分支机操作码是什么意思(X86架构)?

分支机操作码是什么意思(X86架构)?

我有一个简单的 c 代码,经过编译,然后使用提取的文本代码对象转储公用事业。这是转储文件(一段转储文件):

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>

地址处的指令8048446jle 8048457 <main+0x3c> 具有机器码的指令7e 0f

<main+0x3c>语句是指从主地址移出的目标指令的位置,即3c等于60,这意味着在距主地址60个字节之后,该指令

8048457:   8b 45 f4                mov    -0xc(%ebp),%eax

位于。地址8048446为7e的指令的机器码7e 0f
就是jle的机器码。0f是什么?

在另一个类似这样的分支指令中:

 8048455:   eb 15                   jmp    804846c <main+0x51>

15是什么意思?

答案1

Intel CPU架构中存在绝对跳转/代码分支和相对跳转。

您向我们展示的是相对操作数操作码跳转。它们历来被用来节省代码大小。

当你问0f是什么时,意思是跳转当前PC在当前指令结束时正在执行+0f。因此 8048448+0f = 8048457,因此汇编列表显示jle 8048457(jle 表示如果低于或等于则跳转)

同样,8048457+15 = 804846c,因此jmp 804846c

请注意,所有值和数学都是十六进制的。

另外,作为额外的注意,请注意相对跳转操作码的操作数通常是有符号的。虽然在这两个示例中它们仅向前跳转,但它们也可以跳转到之前的位置。

相关内容