关于C语言不定参数的研究

一、 学习过程

编写程序如下:

关于C语言不定参数的研究

编译连接并用debug加载,观察main函数的内容:

关于C语言不定参数的研究

Showchar函数的内容:

关于C语言不定参数的研究

观察发现,main函数要传递两个参数‘a’和2,在汇编代码中是先将2赋给ax,再将ax入栈,然后将a赋给ax,ax入栈。在showchar函数中,程序将sp赋给bp,再从bp+4处取出形参a赋给al,再将al中的值赋给b800690h,然后再从bp+6处取出形参b赋给al,再将al中的值赋给b800691h。可见main函数给showchar传递参数是把要传递的值赋给ax,再将ax入栈,且如果有多个要传递的值,是由后往前将参数入栈。Showchar函数接收参数是将sp赋给bp,然后由bp+4找到栈中存储的参数a,由bp+6找到栈中存储的的参数b,为什么是bp+4bp+6呢?因为程序在将两个参数入栈后,call指令将showchar的地址入栈占2个字节,在showchar中将bp入栈又占2个字节,所以要由bp+4找到第一个参数的地址。那么我对此提出三个问题:

(1) main函数将char型数据和int型数据入栈是占2个字节,那么如果是float型或者long int型、double型、long double型等超过2字节的变量类型怎么办?

(2) Showchar函数将栈中取出的参数赋给al,为什么2int型也只赋给一个字节的al?如果是更大的参数怎么办?

(3) 我们注意到这一个指令

是把al赋给es[bx],是不是所有非ds的段寄存器都要像这样写?

对于第一个问题,我们把程序中的charint改成floatdouble看看:

关于C语言不定参数的研究

编译连接,用debug查看,main函数为:

关于C语言不定参数的研究

Showchar函数为:

关于C语言不定参数的研究

关于C语言不定参数的研究

发现main函数的入栈值为:400800000000000040066666.

再看showchar函数的内容,查资料发现int 35h的作用是读取中断向量,但是不知道它的具体功能,inc siles ax[06fb]int 39的作用是什么呢?

这里我对于c语言的一些语句在汇编里的实现还是有的不理解,但是这不是我们研究的重点,既然暂时弄不懂,就先跳过这个问题。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2660432d6f1e907e8134202b6130e9c2.html