Assembly sscanf是如何工作的?(在装配中)

Assembly sscanf是如何工作的?(在装配中),assembly,stack,scanf,Assembly,Stack,Scanf,我正在尝试对二进制代码生成的汇编代码进行解码。代码中有一个对sscanf函数的调用: 400f08: e8 13 fc ff ff callq 400b20 <sscanf@plt> 400f0d: 89 45 fc mov %eax,-0x4(%rbp) 这是正确的吗? 谢谢 正常情况下,遵循平台的调用约定。默认情况下,32位Linux使用cdecl,这让您将所有参数按相反顺序推送到堆栈上。64位

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

 400f08:       e8 13 fc ff ff          callq  400b20 <sscanf@plt>
 400f0d:       89 45 fc                mov    %eax,-0x4(%rbp)
这是正确的吗?
谢谢

正常情况下,遵循平台的调用约定。默认情况下,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
的参数)。

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

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

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