【问题标题】:How does sscanf work? (in assembly)sscanf 是如何工作的? (组装中)
【发布时间】:2012-10-27 03:18:20
【问题描述】:

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

这是正确的吗? 谢谢!

【问题讨论】:

    标签: assembly stack scanf


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        • 2011-03-10
        相关资源
        最近更新 更多