X86 Objdump hello-world调用说明
这个简单的hello world:X86 Objdump hello-world调用说明,x86,objdump,X86,Objdump,这个简单的hello world: #include <stdio.h> int main(void) { printf("Hello, world!\n"); printf("Hello, world!\n"); return 0; } #包括 内部主(空){ printf(“你好,世界!\n”); printf(“你好,世界!\n”); 返回0; } 在objdump中提供以下程序集: /helloworld.c:3 804842c: 83
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
printf("Hello, world!\n");
return 0;
}
#包括
内部主(空){
printf(“你好,世界!\n”);
printf(“你好,世界!\n”);
返回0;
}
在objdump中提供以下程序集:
/helloworld.c:3
804842c: 83 ec 0c sub $0xc,%esp
804842f: 68 f0 84 04 08 push $0x80484f0
8048434: e8 b7 fe ff ff call 80482f0
8048439: 83 c4 10 add $0x10,%esp
/helloworld.c:4
804843c: 83 ec 0c sub $0xc,%esp
804843f: 68 f0 84 04 08 push $0x80484f0
8048444: e8 a7 fe ff ff call 80482f0
8048449: 83 c4 10 add $0x10,%esp
/helloworld.c:3
804842c:83 ec 0c子$0xc,%esp
804842f:68 f0 84 04 08推送$0x80484f0
8048434:e8 b7 fe ff ff呼叫80482f0
8048439:83 c4 10添加$0x10,%esp
/helloworld.c:4
804843c:83 ec 0c低于$0xc,%esp
804843f:68 f0 84 04 08推送$0x80484f0
8048444:e8 a7 fe ff ff呼叫80482f0
8048449:83 c4 10添加$0x10,%esp
- 为什么对put的相同调用具有不同的十六进制代码(b7与a7)李>
- e8是调用部分,但如何将b7 fe ff转换为80482f0
调用rel32
指令:调用near,相对于下一条指令的位移
此指令的操作码为E8
,后面是通过以下等式计算的相对偏移量:目标地址-下一条指令的地址
在这种情况下,第一次调用的相对偏移量是
80482f0-8048439=fffff eb7
,第二次调用的相对偏移量是80482f0-8048449=fffff ea7
调用rel32
指令:调用附近,相对于下一条指令的位移
此指令的操作码为E8
,后面是通过以下等式计算的相对偏移量:目标地址-下一条指令的地址
在这种情况下,第一次调用的相对偏移量是
80482f0-8048439=fffff eb7
,第二个调用的相对偏移量是80482f0-8048449=fffff ea7
E8
操作码属于调用
指令,其地址与调用
指令本身的地址相对。它使用PC相对寻址
。因此,您所看到的函数地址实际上是从下一条指令的地址到printf
函数起始地址的偏移量
顺便说一句,Intel使用的是little endian,因此这些偏移量必须分别读取为有符号32位整数FFFFF EB7
和FFFEA7
。这意味着printf
函数位于主程序的较低地址
您还可以看到,这两个偏移量之间的差异是一个调用
指令与另一个指令之间的字节差异,因为第二个调用
将比第一个printf
的开始处更远
0x8048444 - 0x8048434 = 16 (decimal)
0xFFFFFEB7 - 0xFFFFFEA7 = 16 (decimal)
E8
操作码属于CALL
指令,其地址相对于CALL
指令本身的地址。它使用PC相对寻址
。因此,您所看到的函数地址实际上是从下一条指令的地址到printf
函数起始地址的偏移量
顺便说一句,Intel使用的是little endian,因此这些偏移量必须分别读取为有符号32位整数FFFFF EB7
和FFFEA7
。这意味着printf
函数位于主程序的较低地址
您还可以看到,这两个偏移量之间的差异是一个调用
指令与另一个指令之间的字节差异,因为第二个调用
将比第一个printf
的开始处更远
0x8048444 - 0x8048434 = 16 (decimal)
0xFFFFFEB7 - 0xFFFFFEA7 = 16 (decimal)