Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 Objdump hello-world调用说明_X86_Objdump - Fatal编程技术网

X86 Objdump 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

这个简单的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 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的相同调用具有不同的十六进制代码(b7a7
  • 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)