- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入了解C语言(函数的参数传递和函数使用参数的方法)
深入了解C语言(函数的参数传递和函数使用参数的方法)
C语言生成的代码在执行效率上比其它高级语言都高.现在让我们来看看C语言生成的代码具体是什么样子的.当你看完本文对于C语言的了解一定会更深一步了.?本文通过一个个实际案例程序来讲解C语言.?研究案例一?工具: Turboc C v2.0,Debug,MASM v5.0,NASM实例C程序:/* example1.c */char ch;int e_main(){?e_putchar(ch);?}?目标内容:C语言调用函数的方法与细节?我们使用的C编译器是16位的Turboc C v2.0,它生成的是16位的代码,比较简单,方便我们来研究.同时我们也需要用到DOS下的DEBUG来进行反汇编.由于我们很多案例中的程序并不是完整的C程序,所以Turboc下的Tlink并不能为我们生成目标程序,所以我将使用MASM中的link.exe,同时里面的也可以为我们把exe文件转换成bin文件.?这个程序没有main函数,我们用e_main来代替main函数.这样我们能避开C语言对main函数进行一系列处理的代码.同样,我们也用e_putchar()来代替我们平常使用的putchar().这里e的意思就是example.?没有了main函数,我们的C程序就没有了入口,所以在开始编译这段C代码之前,我还得写几行简单的汇编代码,通过它来作为我们程序的入口.?; C程序的入口 start.asm[BITS 16][global start][extern _e_main]start:call _e_main?按照C语言的习惯,所以C总的名词都要自动在前面加一个_下划线.所以,我们在C中的e_main函数,如果要在汇编中调用,就变成了_e_main函数.这段汇编代码只有一句:call _e_main,就是调用我们在C中的e_main函数?这段代码我将用nasm来进行编译.生成start.objnasmw -f obj -o start.obj start.asm?下面我们用Turboc C来编译这段C代码:TCC -mt -oexample1.obj -c example1.clink start.obj example1.obj,example1.exe,,,exe2bin example1.exe这样,我们就得到了这段C代码编译出来的机器代码文件(example1.bin)了.下面我们用DEBUG这个老DOS的工具来对example1.bin进行反汇编.?DEBUG-n example1.bin-l 0-u 0xxxx:0000 ? CALL 0003xxxx:0003 ? MOV AX,000Bxxxx:0006 ? PUSH AXxxxx:0007 ? CALL 0020xxxx:000A ? POP CX?这里看到蓝色的代码就是我们整个C程序的所生成的代码了.最开始的第一句CALL 0003是我们用nasm编译的start.asm所生成的代码.我们主要目标是研究蓝色的C语言的代码,第一句start.asm所生成的代码太简单,就是调用e_main函数.而我们的e_main函数就是蓝色代码部分.?从C源程序中我们看到,我们在e_main做的就是一件事情:调用e_putchar(ch);其中ch是传给出e_putchar的参数.?MOV AX,000B?000B就是我们的全局变量ch所在内存的地址.C语言会把所有的全局变量在另一块内存区.C代码先把ch的地址传给AX,然后通过PUSH AX把AX的值,也就是ch的地址压入堆栈.然后再CALL 0020而0020就是e_putchar代码的地址.通过这跳语句,计算机就跳到e_putchar的代码部分去执行了.我在这里并不给出e_putchar的代码,因为我们这个案例只是研究C语言中如何传递参数给其它函数的,并不管e_putchar如何取参数.下在一个案例中,我们将研究函数如何取参数.?在这里我得把CALL指令解释清楚,因为在下个研究函数如何取参数的部分中大家可能会迷惑.CALL XXXX 指令简单地或就是PUSH IPJMP XXXX它首先把当前的执行地址IP压入堆栈,然后跳转到要CALL的地址去.CALL和RET指令是配套的.RET指令等同于POP IP也就是回复CALL前的执行地址IP.正因为这样,所以你一旦使用了CALL指令,你的堆栈指针SP就会自动减2.?POP CX是每个函数调用完毕后都有的必备操作.在这里它不起任何作用.可能唯一的作用就是与CALL 0020前的PUSH AX像对应.
您可能关注的文档
- 浅谈中国人的传统思维定式.doc
- 浅谈中医与藏医的结合与传统医学未来发展的的建议.doc
- 浅谈中国传统武术的发展之策.doc
- 浅谈企业如何创新青年员工思想.doc
- 浅谈传统思想教育和现代心理教育的结合.doc
- 浅谈儿童画的创作与评价.doc
- 浅谈凭祥壮族传统文化.doc
- 浅谈写作的三个阶段.doc
- 浅谈初中化学教学中学生创新能力培养.doc
- 浅谈多媒体技术在农村小学教学中的运用.doc
- GB/T 46622.1-2025液压传动 螺纹插装阀安装连接尺寸 第1部分:米制螺纹.pdf
- 《GB/T 46622.1-2025液压传动 螺纹插装阀安装连接尺寸 第1部分:米制螺纹》.pdf
- 2025重庆渝海物业管理有限责任公司外包岗位招聘7人备考题库最新.docx
- 岳池县兴隆镇公开招聘社区网格员的备考题库最新.docx
- 2025湖南怀化市靖州县纪委监委选调11人备考题库最新.docx
- 2025年镇原县科技局下属事业单位招聘笔试参考题库附答案.docx
- 贵州国企招聘:2025中国人民财产保险股份有限公司贵州省分公笔试参考题库附答案.docx
- 2025年武汉铁路局集团招聘(180人)笔试参考题库最新.docx
- 2025重庆市应急管理局遴选公务员7人备考题库附答案.docx
- 赣州市人力资源有限公司公开招聘劳务派遣制工作人员备考题库附答案.docx
原创力文档


文档评论(0)