printf函数遵守C调用规范,即参数 从右至左 压栈,堆栈由调用者平衡。(这种从右至左的方式不会随着编译器,机器的不同而不同) )。
[code]
printf("%d,%d", i, i++ ); 产生的汇编码大致像下面这样:
mov eax,dword ptr [i]
push eax //最右边那个i的值被压入栈中
inc eax //i++
mov dword ptr[ i ], eax
mov edx,dword ptr [i]
push edx //第二个i的值被压入栈中
push offset string "%d,%d" //字符串 "%d,%d"的地址被压入栈中
call printf //跳转到函数print
add esp, 12 //平衡堆栈
[/code]
有几个小题帮助分析:
1.
#include <stdio.h>
int main()
{
char * p = "abcdefg";
printf("%c%", *p,*(p++));
return 0;
}
输出结果:ba
2.
#include <stdio.h>
int main()
{
char * p = "abcdefg";
printf("%c%c%c", *p,*(p++), *(++p));
return 0;
}
输出结果:bbc
3.
#include <stdio.h>
int main()
{
char * p = "abcdefg";
printf("%c%c", *p,*(p+3));
return 0;
}
输出结果:ad