【问题标题】:x86 - C's sscanf functionx86 - C 的 sscanf 函数
【发布时间】:2012-02-16 11:28:42
【问题描述】:

所以我在 x86 汇编中有以下代码段:

mov $0x0, %eax
callq  400ac8 <__isoc99_sscanf@plt>
cmp    $0x5,%eax
jg     40152d <this_function+0x3d>   -----> jumps to add two lines down
callq  4014b a <error_program>
add    $0x18,%rsp
retq

现在在第一行,它将 %eax 设置为零。然后它调用 sscanf 然后检查 %eax 是否为 5。如果它大于 5,它将继续,否则终止。所以我做了一个简单的C代码:

eax = 0;
sscanf();
if (eax < 5) error_program();
return;

这是一个二进制文件的对象转储,所以我确信它是正确的。但是,eax 将始终为零,并且错误将触发。我是对的吗?或者 sscanf 有没有可能操纵 eax?

谢谢

【问题讨论】:

  • 这没有意义 - 程序不会每次都终止..
  • 我对你在这里的内容感到很困惑,我认为你可能应该包括更多的周边代码、调用示例等。(我删除了我的第一条评论,因为回想起来它似乎没有足够有用。)
  • "这是一个二进制文件的对象转储,所以我确信它是正确的。"一个做线性扫描的静态反汇编器很容易被愚弄

标签: assembly x86


【解决方案1】:

函数在 eax 中传回返回值是很常见的;至少,它不能保证被保存。那么也许这段代码正在检查以确保 sscanf 找到至少 5 个项目?

【讨论】:

  • 另外,eax 设置为 0 表示没有在 SSE 寄存器中传递参数。
【解决方案2】:

简短的回答是肯定的,sscanf 肯定会修改 %eax。 %rax 是默认的寄存器函数,总是将它们的返回值放入其中。

我做了一些研究,结果是这样的:

成功时,函数返回参数列表中成功填充的项目数。在匹配失败的情况下,此计数可以匹配预期的项目数或更少(甚至为零)。 如果在成功解释任何数据之前输入失败,则返回 EOF。

在此处查看更多信息:http://www.cplusplus.com/reference/cstdio/sscanf/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多