assembly - sscanf 是如何工作的? ( assembly 中)

标签 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)

这是正确的吗? 谢谢!

最佳答案

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

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

关于assembly - sscanf 是如何工作的? ( assembly 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096934/

相关文章:

linux - 创建/写入文件 x86 Linux

java - 堆栈是从 0 开始还是从 1 开始?

c - 尝试读取包含空格时会跳过 Scanf()

c - 使用 scanf() 处理过度输入

c - 带分隔符的文件中的 fgets 和 sscanf 记录

assembly - 错误 a2070 指令操作数无效

assembly - CL比较验证范围不起作用

c - 编译器如何区分名称相同的项目

c++ - 访问冲突写入位置 0xCDCDCDCD

linux - 确定线程的堆栈大小和位置