我有一个简单的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是什么意思?
英特尔CPU架构中存在绝对跳转/代码分支和相对跳转。
您显示给我们的是相对操作数操作码跳转。从历史上看,它们一直用于节省代码大小。
当您询问0f是什么时,这意味着在当前正在执行的指令+ 0f的末尾跳转当前PC 。因此8048448 + 0f = 8048457,因此显示了程序清单jle 8048457
(jle表示低于或等于则跳转)
同样,8048457 + 15 = 804846c,因此 jmp 804846c
请注意,所有值和数学均以十六进制表示。
另外,请注意,相对跳转操作码的操作数通常是带符号的。虽然在这两个示例中它们只是向前跳,但它们也可以跳转到先前的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句