5

我在 c: 中键入此代码__asm__("mov $10, %rsi"); printf("%x"),它打印a
我在调试它gdb,发现结果存储在 intregister esi中。
问题:为什么结果是esi

4

2 回答 2

12

printf("%x")试图获得第二个参数,但它不存在,所以它只是读取它应该存在的内存,找到那里的任何垃圾,然后打印它。

简而言之:它是未定义的行为。

编辑:您看到与寄存器中的值相同的原因esi是因为System V AMD64 ABI(这是大多数 Unix 遵循的规范)尽可能通过寄存器传递前几个参数。第二个参数是通过 传递的rsi,因此这printf就是读取的位置。

于 2013-04-23T08:31:11.083 回答
2

调用printf("%x")时,它需要的参数被推送到堆栈(以相反的顺序),最终,使用汇编命令调用该函数call。提供格式字符串"%x"时,printf()至少需要一个参数,因此它将读取堆栈上的下一个值,可以是任何值......
所以这种行为实际上是未定义的,通常是漏洞的原因,因为你可能会破坏堆栈.

也许关于这个话题的一些交流。

于 2013-04-23T08:36:22.737 回答