“printf”的返回值是实际打印的字符的个数,有一个小程序
#include<stdio.h>
int main()
{
printf("1");
printf("55555");
printf("10________");
printf("13___________");
printf("18________________");
printf("28__________________________");
return 0;
}
它会打印
15555510________13___________18________________28__________________________
然后本人用gdb来调试,查看每步之后,printf是不是把返回值放到$eax里面了:
(gdb) b main
Breakpoint 1 at 0x804844c: file testp.c, line 4.
(gdb) r
Starting program: /home/a/cpp/a.out
Breakpoint 1, main () at testp.c:4
4 printf("1");
(gdb) n # 本人认为将会把"1"放入eax
5 printf("55555");
(gdb) p $eax # 和本人的预期不一致
$1 = 49
(gdb) n
6 printf("10________");
(gdb) p $eax # 符合预期
$2 = 5
(gdb) n
7 printf("13____________");
(gdb) p $eax # 符合预期
$3 = 10
本人认为c语言的abi是规定了函数的返回值放到eax寄存器(x86架构),那么为什么第一次p $eax不符合本人的预期,后面才符合预期?
谢谢。
解决方案
40
printf 的返回值的含义参看:http://en.cppreference.com/w/c/io/fprintf
20
要确认当前eip的值是在刚执行完printf函数之后。