深入了解c语言(函数的参数传递和函数使用参数的方法)

深入了解c语言(函数的参数传递和函数使用参数的方法)

ID:11355959

大小:30.50 KB

页数:5页

时间:2018-07-11

深入了解c语言(函数的参数传递和函数使用参数的方法)_第1页
深入了解c语言(函数的参数传递和函数使用参数的方法)_第2页
深入了解c语言(函数的参数传递和函数使用参数的方法)_第3页
深入了解c语言(函数的参数传递和函数使用参数的方法)_第4页
深入了解c语言(函数的参数传递和函数使用参数的方法)_第5页
资源描述:

《深入了解c语言(函数的参数传递和函数使用参数的方法)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、深入了解C语言(函数的参数传递和函数使用参数的方法)C语言生成的代码在执行效率上比其它高级语言都高.现在让我们来看看C语言生成的代码具体是什么样子的.当你看完本文对于C语言的了解一定会更深一步了. 本文通过一个个实际案例程序来讲解C语言. 研究案例一 工具:TurbocCv2.0,Debug,MASMv5.0,NASM实例C程序:/*example1.c*/charch;inte_main(){ e_putchar(ch); } 目标内容:C语言调用函数的方法与细节 我们使用的C编译器是16位的TurbocCv2.0,它生成的是16位的代码,比较简单,方便我们来研究.同时我们也需要用到DOS下

2、的DEBUG来进行反汇编.由于我们很多案例中的程序并不是完整的C程序,所以Turboc下的Tlink并不能为我们生成目标程序,所以我将使用MASM中的link.exe,同时里面的exe2bin.com也可以为我们把exe文件转换成bin文件. 这个程序没有main函数,我们用e_main来代替main函数.这样我们能避开C语言对main函数进行一系列处理的代码.同样,我们也用e_putchar()来代替我们平常使用的putchar().这里"e"的意思就是"example". 没有了main函数,我们的C程序就没有了入口,所以在开始编译这段C代码之前,我还得写几行简单的汇编代码,通过它来作为我

3、们程序的入口. ;C程序的入口start.asm[BITS16][globalstart][extern_e_main]start:call_e_main 按照C语言的习惯,所以C总的名词都要自动在前面加一个"_"下划线.所以,我们在C中的e_main函数,如果要在汇编中调用,就变成了_e_main函数.这段汇编代码只有一句:call_e_main,就是调用我们在C中的e_main函数 这段代码我将用nasm来进行编译.生成start.objnasmw-fobj-ostart.objstart.asm 下面我们用TurbocC来编译这段C代码:TCC-mt-oexample1.obj-cexa

4、mple1.clinkstart.objexample1.obj,example1.exe,,,exe2binexample1.exe这样,我们就得到了这段C代码编译出来的机器代码文件(example1.bin)了.下面我们用DEBUG这个老DOS的工具来对example1.bin进行反汇编. DEBUG-nexample1.bin-l0-u0xxxx:0000 CALL0003xxxx:0003 MOVAX,000Bxxxx:0006 PUSHAXxxxx:0007 CALL0020xxxx:000A POPCX 这里看到蓝色的代码就是我们整个C程序的所生成的代码了.最开始的第一句CALL0

5、003是我们用nasm编译的start.asm所生成的代码.我们主要目标是研究蓝色的C语言的代码,第一句start.asm所生成的代码太简单,就是调用e_main函数.而我们的e_main函数就是蓝色代码部分. 从C源程序中我们看到,我们在e_main做的就是一件事情:调用e_putchar(ch);其中ch是传给出e_putchar的参数. MOVAX,000B 000B就是我们的全局变量ch所在内存的地址.C语言会把所有的全局变量在另一块内存区.C代码先把ch的地址传给AX,然后通过PUSHAX把AX的值,也就是ch的地址压入堆栈.然后再CALL0020而0020就是e_putchar代码

6、的地址.通过这跳语句,计算机就跳到e_putchar的代码部分去执行了.我在这里并不给出e_putchar的代码,因为我们这个案例只是研究C语言中如何传递参数给其它函数的,并不管e_putchar如何取参数.下在一个案例中,我们将研究函数如何取参数. 在这里我得把CALL指令解释清楚,因为在下个研究函数如何取参数的部分中大家可能会迷惑.CALLXXXX指令简单地或就是PUSHIPJMPXXXX它首先把当前的执行地址IP压入堆栈,然后跳转到要CALL的地址去.CALL和RET指令是配套的.RET指令等同于POPIP也就是回复CALL前的执行地址IP.正因为这样,所以你一旦使用了CALL指令,你的

7、堆栈指针SP就会自动减2. POPCX是每个函数调用完毕后都有的必备操作.在这里它不起任何作用.可能唯一的作用就是与CALL0020前的PUSHAX像对应.这样堆栈指针SP才能回原. 好了,简单的第一个案例研究结束了.虽然就这4跳指令,但是我们已经可以看出C语言传递参数方法了.总结起来就是通过"MOVAX,参数地址"把参数的地址传到AX,然后"PUSHAX"把参数的地址压入堆栈.最后"CALL函数

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。