printf主要是给控制台打印字符串或者数字等。
1、printf的参数列表printf ( const char *format, ... )
2、printf首先调用va_start.然后调用_output_l,最后调用_ftbuf
3、_output_l会解析字符串并调用va_arg,获取省略号的值,调用WRITE_STRING写到控制台上。
4、WRITE_STRING会调用write_char,write_char会调用_putc_nolock,最终调用_flsbuf。
之前有人问printf("%f",1);为什么打印的是0。
因为这种情况在va_arg(vl,double)获取到值是0
printf的va_arg的汇编代码如下:
623D9A24 mov edx,dword ptr [ebp+14h]
623D9A27 add edx,8
623D9A2A mov dword ptr [ebp+14h],edx
623D9A2D mov eax,dword ptr [ebp+14h]
623D9A30 mov ecx,dword ptr [eax-8]
623D9A33 mov edx,dword ptr [eax-4]
623D9A36 mov dword ptr [tmp],ecx
623D9A3C mov dword ptr [ebp-29Ch],edx