x86 - C的sscanf函数

时间:2012-01-23 00:41:55

标签: assembly x86

所以我在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吗?

由于

2 个答案:

答案 0 :(得分:4)

函数通常将返回值传递回eax;至少,它不能保证得到保留。所以也许这段代码正在检查以确保sscanf找到至少5项?

答案 1 :(得分:3)

简短回答是,sscanf肯定会修改%eax。 %rax是默认的寄存器函数,它们的返回值始终为。

我做了一些研究并且说了这个:

  

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

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