我正在尝试解码从二进制文件生成的一些汇编代码。代码中调用了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)
这是正确的吗? 谢谢!
最佳答案
照常遵循平台的调用约定。 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
的参数。
关于assembly - sscanf 是如何工作的? ( assembly 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096934/