汇编第七章.ppt
《汇编第七章.ppt》由会员分享,可在线阅读,更多相关《汇编第七章.ppt(63页珍藏版)》请在沃文网上搜索。
1、CompanyLOGO第七章第七章第七章第七章 汇编语言与汇编语言与汇编语言与汇编语言与C/C+C/C+混合编程混合编程混合编程混合编程电子工业出版社第七章第七章第七章第七章 汇编语言与汇编语言与汇编语言与汇编语言与C/C+C/C+混合编程混合编程混合编程混合编程7.1混合编程17.2C/C+的嵌入式汇编27.3C/C+调用汇编模块37.1 7.1 混合编程混合编程混合编程混合编程 混合编程即由高级语言来调用或嵌入汇编语言子程序,或用汇编语言调用或嵌入高级语言子程序。有两种方法可以实现汇编语言与C/C+语言的混合程序设计。(1)在CC+语言中直接嵌入汇编语言语句,即嵌人式汇编。这种方法比较简洁
2、直观,但功能较弱,此外,由于在其CC+程序中嵌入一段汇编语言程序段,会降低该程序的可移植性。(2)另一种方法是,两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序,这种方法使用灵活、功能强。7.1 7.1 混合编程混合编程混合编程混合编程高级语言与汇编语言的接口必须解决两个关键问题:(1)是调用者和被调用者之间的程序控制权问题。(2)参数传递问题,利用寄存器、存储器和堆栈传递参数。7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编 1嵌入方式在C/C+中,嵌入汇编语言指令是在汇编语句前加一个_asm关键字(asm前面是两个
3、下划线),格式如下:格式1:_asm操作码操作数格式2:_asm汇编指令1汇编指令2汇编指令n7.2.1 在在C/C+程序嵌入汇编语句程序嵌入汇编语句 7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编例:要嵌入movax,01h和int10h两条汇编语句,可以有如下三种方式:方式1:_asm/成组嵌入movax,01hint10h方式2:_asmmovax,01h/逐条嵌入_asmint10h方式3:_asmmovax,01h_asmint10h/在一行中嵌入多条7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编因此,在嵌入多条汇编
4、指令时,通常采用格式2。如若要嵌入一组汇编语句,通常采用如下方式:_asm/实现整型变量x和y之值的交换movax,xxchgax,ymovx,ax7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编【例7-1】在C语言程序中嵌入汇编语句,实现赋值SUM=A+B+C。其中:A、B、C及SUM均为16位整型变量。#include#includemain()shorta,b,c,sum;/变量A、B、C及SUM均为16位整型变量a=10;b=20;c=30;7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编_asm/实现16位整型变量相加S
5、UM=A+B+Cmovax,aaddax,baddax,cmovsum,axprintf(“SUM=%d”,sum);7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编【例7-2】在C语言程序中嵌入汇编语句,实现赋值SUM=A+B+C。其中:A、B、C及SUM均为32位整型变量。#include#includemain()inta,b,c,sum;/变量A、B、C及SUM均为32位整型变量a=10;b=20;c=30;7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编_asm/实现32位整型变量相加SUM=A+B+Cmoveax,aa
6、ddeax,baddeax,cmovsum,eaxprintf(“SUM=%d”,sum);7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编2约定和限制嵌入式汇编代码可以使用汇编表达式,这个表达式是操作数和操作符的组合,产生一个数值或地址。嵌入式汇编语言语句中,可以使用汇编语言格式表示整数常量(如378h),也可以采用C+的格式(如0 x378)。嵌入式汇编语言语句中,注释可以使用C注释风格(如/*/和/),也可以使用汇编语言的注释风格。嵌入式汇编语句不能使用C的专用操作符,如、+、-等。对两种语言都有的操作符,在汇编语句中作为汇编语言操作符,如*,等。在C语言
7、中,表示数组的某个元素,而在汇编语言中,表示字节偏移量,其意义是不一样的。7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编例:intarray6;/下面两条意义不同array6=0;/将0存储在array+24_asmmovarray6,ebx/将ebx的值存储在array+6/下面两条意义相同array6=0;/将0存储在array+24_asmmovarray6*TYPEint,ebx/将ebx的值存储在array+247.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编嵌人式汇编代码不支持汇编伪指令定义的数据(如DB、DW、DD
8、、DT、DF、DUP、THIS等定义的操作数)。在嵌人式汇编代码中,不能使用汇编的结构和记录(如STRUCT、RECORD、WIDTH及MASK等),也不能使用宏伪指令(如MACRO,ENDM,REPEATFORFORC等)和宏操作符(如!,&,等)。虽然嵌入式汇编不支持大部分汇编伪指令,但它支持EVEN和ALIGN。这些指令将NOP指令放在汇编代码中以便对齐边界。对有些处理器来说,这样可以更有效地读取指令。7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编嵌入式汇编引用段时只能通过寄存器而不能通过段名,段超越时,必须明确地用段寄存器来说明。例如:MOVAX,ES
9、:EBX在用汇编语言编写的函数中,不必保存EAX,EBX,ECX,EDX,ESl和EDI寄存器;但必须保存函数中使用的其他寄存器(如DS,SS,ESP,EBP和整数标志寄存器),例如用STD和CLD改变方向标志位,就必须保存标志寄存器的值。嵌入式汇编支持80X86的全部指令系统。对于还不能支持的指令,VC提供了_emit伪指令用于机器指令(以字节为单位)的扩展。格式:_asm_emit7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编1使用C程序的变量在嵌入式汇编语句中,可以使用C程序中的变量或常量。【例7-3】获取C变量和类型的大小#include#includ
10、emain()intarray8;inta,b,c;_asmmoveax,LENGTHarraymovebx,TYPEarray0movecx,SIZEarray7.2.2 在嵌入式汇编中访问在嵌入式汇编中访问C/C+的数据的数据 7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编mova,eaxmovb,ebxmovc,ecxprintf(LENGTH=%dTYPE=%dSIZE=%d,a,b,c);getchar();7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编程序运行显示的结果为:LENGTH=8TYPE=4SIZE=32
11、从上面例子可以看出,对于一个C语言中的整型数组intarray8来说,数组共有8个int元素,由于int类型是32位,占4个字节,则有:LENGTHarray返回值为8(相当于C的sizeof(array)sizeof(array0);TYPEarray返回值为4(相当于C的sizeof(array0);SIZEarray返回值为32(相当于C的sizeof(array);7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编【例7-4】实现对array数组元素自动求和main()intarray=1,13,5,10,-1,9,4,2,-21,32;intsum;_a
12、sm/实现对array数组元素求和movecx,LENGTHarray/用LENGTH操作符获取数组元素的个数moveax,0movesi,0next:7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编addeax,arrayesiaddesi,4loopnextmovsum,eaxprintf(sum=%d,sum);/打印汇编代码的求和结果getchar();7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编2标号的使用标号在两种语言中都用来标识程序语句的位置,汇编语句可以转到C程序的标号位置,C程序也能转到汇编程序的标号位置。需
13、要特别注意的是:C程序是大小写敏感的,而汇编则对大小写不加区分。例:voidfunc(void)gotoC_Dest;/正确gotoc_dest;/错误gotoA_Dest;/正确gotoa_dest;/正确7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编_asmjmpC_Dest;正确jmpc_dest;错误jmpA_Dest;正确jmpa_dest;正确a_dest:;汇编标号C_Dest:/C标号return;7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编3结构成员的引用嵌入式汇编语句可以方便地访问C语言结构中的某个成员,
14、通常有两种引用方法。(1)通过变量名引用,即采用结构变量名加成员名的方法:结构变量名.成员名(2)通过变量地址引用,即把结构变量的首地址送往某一地址寄存器,然后用该寄存器名(加方括号)再加成员名,中间用圆点隔开。地址寄存器.成员名7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编例:structscoreinta;intb;intc;)s1,s2;example()asmmoveax,s1.a/取结构变量s1的成员a7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编asmmoveax,s2.c/取结构变量s2的成员casmmovebx
15、,offsetsl/取结构变量s1的主存地址asmmovecx,ebx.b/取结构变量s1的成员b如果类、结构、联合的成员名字惟一,可不说明变量或类型名就可以引用成员名,否者必须说明。7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编4使用C语言的宏指令用C/C+宏可以方便地将一段汇编代码插入到源程序中。书写具有嵌入汇编的C/C+宏时,应遵循下列规则:将汇编程序段放在括号中,每一个汇编语言指令前必须有_asm标志,应该使用C的注释风格(/*/),不要使用单行注释(/)和汇编语言的分号注释方式。例:#definePORTIO_asm/*端口输出*/_asmmovdx
16、,0 xD007_asmoutal,dx宏展开为:_asm/*端口输出*/_asmmovdx,0 xD007_asmoutal,dx7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编利用嵌入式汇编可以方便地编写C程序中的函数,函数的定义和函数调用与C程序相同,只是在函数体内嵌入汇编语言程序段。【例7-5】用嵌入式汇编编写C函数#includeintpower2(intnum,intpower);voidmain(void)printf(2的5次方乘以3等于:%dn,power2(3,5);/显示函数返回值getchar();7.2.3 用汇编程序段编写用汇编程序段
17、编写C函数函数 7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编intpower2(intnum,intpower)_asmmoveax,num;第一个参数3送eaxmovecx,power;第二个参数5送ecxshleax,cl;eax左移5次,EAX=3*25/*寄存器EAX的内容作为函数的默认返回值*/该程序运行后显示结果如下:2的5次方乘以3等于:967.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编【例7-6】用嵌入汇编方式实现取两数较小值的函数MIN。#includeintMIN(intVAR1,intVAR2)/嵌人汇
18、编实现求较小值intmin;_asmmoveax,VAR1/第一个参数VAR1送eaxcmpeax,VAR2/比较第一个参数VAR1与第二个参数VAR2jgemaxexitmoveax,ymovmin,eax7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编minexit:movmin,eax/将寄存器eax的内容赋值给变量minreturn(min);/将变量min的内容作为函数的返回值voidmain()printf(max=%dn,MIN(100,200);/显示比较结果getchar();7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编
19、的嵌入式汇编1参数传递汇编程序向C函数传递参数的方法是通过堆栈。由于被调用的C函数是从栈顶访问参数,所以在汇编程序中参数的压栈顺序要与C函数的参数顺序相反。比如汇编程序希望把参数a、b、c依次传送给C函数的三个形式参数x、y、z。则汇编程序的压栈顺序应为c、b、a。在汇编语言程序调用C函数完成后,应该立即平衡堆栈,即清除堆栈里的参数,恢复堆栈到调用前的情形,通常我们可以利用一组POP指令来完成堆栈的平衡。7.2.4 在嵌入式汇编中调用在嵌入式汇编中调用C/C+函数函数 7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编【例7-7】汇编代码传递参数给C函数的压栈次序
20、c_func(intx,inty,intz)/C函数c_func的参数次序为x、y、z_asm/调用C函数c_func(a,b,c)moveax,c/按c、b、a的次序压栈,将a、b、c依次传送给参数x、y、zpusheaxmoveax,bpusheax7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编moveax,apusheaxcallc_func/调用C函数c_funcpopebx/平衡堆栈,恢复堆栈到调用前的情形popebxpopebx7.2 7.2 C/C+C/C+的嵌入式汇编的嵌入式汇编的嵌入式汇编的嵌入式汇编【例7-8】汇编代码按值和按址传递参数给C
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 第七