3

我正在尝试解码从二进制文件生成的一些汇编代码。代码中有对sscanf函数的调用:

 400f08:       e8 13 fc ff ff          callq  400b20 <sscanf@plt>
 400f0d:       89 45 fc                mov    %eax,-0x4(%rbp)

你能告诉我sscanf在装配中是如何工作的吗?我很确定参数的数量存储在%eax...中。它是否以相反的顺序将输入推入堆栈?所以说我的输入是0 1,在运行 sscanf, %eax=2 之后,堆栈看起来像:

1
0  <----%rsp (top of the stack)

这个对吗?谢谢!

4

2 回答 2

4

像往常一样遵循平台的调用约定。32 位 Linux 默认使用 cdecl,它让您以相反的顺序将所有参数压入堆栈。64 位 Linux 使用 System V AMD64 ABI 约定,它使用RDIRSIRDXRCXR8R9来表示整数和地址,而 XMM 寄存器用于浮点参数(剩余参数在堆栈上)。

参数的数量不会被推送到任何地方;AFAIKsscanf从格式字符串中确定这一点(尽管我很高兴得到纠正)。System V AMD64 ABI(64 位)确实指定AL用于存储使用的 XMM 寄存器的数量(从 0 到 8),但这仅适用于浮点参数(绝不应该是 的参数sscanf)。

于 2012-10-27T05:59:05.097 回答
1

sscanf将要扫描的字符串、格式字符串和指向存储扫描结果的变量的指针作为参数。因此,假设扫描成功,您的 0 和 1 数字将存储在相应的变量中。

EAX包含返回值。该*scanf系列函数返回成功扫描的元素数量,因此您可以知道扫描是否成功,以及扫描成功的程度。

于 2012-10-27T11:19:13.243 回答