“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函数之后。