printf函数栈的有关问题
printf函数栈的问题我们知道,C语言是调用者负责管理堆栈,所以实现有可变参数的函数。对于可变参数的函数,其
printf函数栈的问题
我们知道,C语言是调用者负责管理堆栈,所以实现有可变参数的函数。对于可变参数的函数,其压栈与清栈在编译时写在调用处,而其参数的使用则是被调用函数在运行时控制。那么,对于这个例子:
[解决办法]根据我的理解,printf("%f %f\n",a,b);语句中,printf会根据两个%f来寻找跟在后面的两个参数,而不会识别不同的两个参数,如:printf寻找a的时候,只识别它的4个字节,而不会当成8个字节来读。
以下是建栈的过程:
建栈:
push b,
push a,
push pt,//"%f %f\n"字符串的函数指针
call @printf
[解决办法]任何变量都要内存对齐,另外因为不定参数的原因,float变量也会扩宽带double.
[解决办法]int char short 16位系统 转成int,2字节压栈,32位系统 转成int,4字节压栈
float,double 转成double具体就是,用浮点寄存器堆栈获取,然后8字节,浮点寄存器栈顶数据压栈
指针16位系统 near 指针转成int(2字节其实根本就不做任何转换,4字节直接入栈)
或者 far指针转long (其实根本就不做任何转换,4字节直接入栈,指针本来就是这样表示的)
32 位16位系统转long (或int)(其实根本就不做任何转换,4字节直接入栈,指针本来就是这样表示的)
[解决办法]printf里面的 %f 都是读取sizeof(double)的