我正在尝试解码从二进制文件生成的一些汇编代码。在代码中调用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)
这是对的吗? 谢谢!
答案 0 :(得分:4)
照常遵循平台的调用约定。默认情况下,32位Linux使用cdecl,它会以相反的顺序将所有参数压入堆栈。 64位Linux使用System V AMD64 ABI约定,该约定使用RDI
,RSI
,RDX
,RCX
,R8
和R9
对于整数和地址以及用于浮点参数的XMM寄存器(剩余参数在堆栈上)。
参数的数量不会被推到任何地方; AFAIK sscanf
从格式字符串中确定这一点(尽管我很乐意予以纠正)。 System V AMD64 ABI(64位)确实指定AL
用于存储所使用的XMM寄存器的数量(从0到8),但这仅适用于浮点参数(永远不应该是参数)到sscanf
)。
答案 1 :(得分:1)
sscanf
将要扫描的字符串,格式字符串和指针作为参数,用于存储扫描结果的变量。因此,假设扫描成功,您的0和1数字将存储在相应的变量上。
EAX
包含返回值。 *scanf
系列函数返回成功扫描的元素数,因此您可以知道扫描是否成功,以及它是否成功。