所以我在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吗?
由于
答案 0 :(得分:4)
函数通常将返回值传递回eax;至少,它不能保证得到保留。所以也许这段代码正在检查以确保sscanf找到至少5项?
答案 1 :(得分:3)
简短回答是,sscanf肯定会修改%eax。 %rax是默认的寄存器函数,它们的返回值始终为。
我做了一些研究并且说了这个:
成功时,该函数返回成功填充的参数列表中的项目数。此计数可以匹配预期的项目数,或者在匹配失败的情况下更少(甚至为零)。 如果在成功解释任何数据之前输入失败,则返回EOF。