我有一个简单的 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>
地址处的指令8048446
是jle 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
请注意,所有值和数学都是十六进制的。
另外,作为额外的注意,请注意相对跳转操作码的操作数通常是有符号的。虽然在这两个示例中它们仅向前跳转,但它们也可以跳转到之前的位置。