C和汇编之间参数传递机制剖析

C和汇编之间参数传递机制剖析

ID:44290565

大小:56.11 KB

页数:4页

时间:2019-10-20

C和汇编之间参数传递机制剖析_第1页
C和汇编之间参数传递机制剖析_第2页
C和汇编之间参数传递机制剖析_第3页
C和汇编之间参数传递机制剖析_第4页
资源描述:

《C和汇编之间参数传递机制剖析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C和汇编之间参数传递机制剖析C和汇编之间参数传递机制剖析摘耍:本文剖析了混合编程转返机制和参数传递的基本方法。Abstract:Thispaperillustratesthemixedprogrammingturnbackmechanismandbasicmethodsofparametertransferring・关键词:C语言;汇编语言;参数传递Keywords:Clanguage;assemblylanguage;parametertransferring屮图分类号:TP312文献标识码:A文章编号:1006-4311(2014)29

2、-0225-021绪论C语言与汇编语言混合编程,可以发挥各自优势,提高程序的开发效率。这必然涉及到二者相互调用时的接口:C程序与汇编程序如何转返、二者之间如何互传数据。2名字声明约定2.1汇编、C模块对自己未定义的但要引用的别的模块的名字(该名字允许被引用)要声明。C模块声明格式:函数声明格式:extern类型函数名(形参表);变声明格式:Extern类型变量;汇编模块声明格式:函数声明格式:extern函数名:属性(near,far)o变声明格式:Extern变量名:属性(byte,word,dword等)。2.2自己定义的不仅自己可用,

3、且可供别的模块引用的名字也必须声明。汇编模块声明格式:PUBLIC名字。C模块声明格式:全局变量,函数名前不加static即可。3转返机制为了说明C主程序如何转到汇编子程序,汇编子程序执行结束如何返回C主程序,把例1xl.cC程序翻译成汇编程序xl.asm,命令行键入命令TCC-Sxl即可。例1/*xl.c*/externintf2(int,int,int);main(){inta;a=f2(1,2,3);a=a+10;}上述程序经编译后,汇编程序如下(无关内容省去)/*xl.asm*/TEXTsegmentbytepublic'CODE'

4、mainprocnear;小模式,类型为near,名字main编译后变为内部名(前加下划线)pushsi;保护simovax,3pushax;实参3压栈movax,2pushax;实参2压栈movax,1pushax;实参1压栈callnearptr_f2;转入子程序addsp,6;丢弃栈中三个实参,确保实参不变movsi,ax;出口参数固定是ax,从ax取结果movax,si;机械性翻译,效率低,人工汇编编程,两个mov可不要addax,10movsi,ax;出口参数固定是ax,main加工结果送到约定寄存器ax@1:popsi;恢复si

5、ret;main子程序返回_mainendp_TEXTendsPC机的堆栈是由高向低发展,压栈操作,栈中内容增多,SP值减小,反Z出栈操作,栈中内容减少,SP值增大。分析以上程序可看出,f(1,2,3)翻译成机器语言后变成若干条机器指令。结论:参数从右到左进入堆栈;在函数返回后,调用者要负责清除(平衡)堆栈。4C调汇编了程序参数传递调用规范:主程序通过堆栈传递参数,主程序把待加工的数据放入栈中,子程序从堆栈中取数。子程序把加工的加工返还给主程序,结果小于等于16位,固定用AX;结果是32位,固定用DX和AX;结果大于32位,则存放在静态变量

6、存贮区,AX(存段内地址)指向该区,若是FAR指针,DX(存段地址)和AX指向该区。所传数据可能是值,称为值传递,可能是地址,称为地址传递。4.1值传递:实参的值压栈例2/*fl.c*/externintaddO(int,int);main(){intx,y;x=2;y=3;printf(〃%daddO(x,y));};f2.asm.modelsmall,c;小模式,nearii程,栈中只压IP,无CSpublicaddO.codeaddOprocpushbpmovbp,spmovax,[bp+4];取笫一个实参Xaddax,[bp+6]

7、;取第二个实参Y,出UAXpopbpret;弹出返刨地址,返刨addOendpend程序运彳亍结果是:54.2传地址:实参的地址压栈例3/*fl.c*/externintaddO(int*,int*);main(){intx,y;x二2;y二3;printf(“%d",addO(&x,&y));};f2・asm・modelsmall,c;小模式,near过无呈,栈屮只压IP,无CSpublicaddO・codeaddOprocpushbpmovbp,spmovbx,[bp+

8、4];取第一个实参X的地址送bxmovax,[bx]movbx,[bp+6];取第二个实参Y的地址送bxaddax,[bx];£DAXpopbpret;弹出返刨地址,返回addO

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

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

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