sscanf如何运作? (在组装中)

时间:2012-10-27 03:18:20

标签: assembly stack scanf

我正在尝试解码从二进制文件生成的一些汇编代码。在代码中调用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)

这是对的吗? 谢谢!

2 个答案:

答案 0 :(得分:4)

照常遵循平台的调用约定。默认情况下,32位Linux使用cdecl,它会以相反的顺序将所有参数压入堆栈。 64位Linux使用System V AMD64 ABI约定,该约定使用RDIRSIRDXRCXR8R9对于整数和地址以及用于浮点参数的XMM寄存器(剩余参数在堆栈上)。

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

答案 1 :(得分:1)

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

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