微机原理与汇编语言程序设计-第11章_第1页
微机原理与汇编语言程序设计-第11章_第2页
微机原理与汇编语言程序设计-第11章_第3页
微机原理与汇编语言程序设计-第11章_第4页
微机原理与汇编语言程序设计-第11章_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、教学重点第第11章介绍实际应用当中,章介绍实际应用当中,常见的混合编程问题,重点常见的混合编程问题,重点是参数传递方法是参数传递方法混合编程的两种方式混合编程的两种方式模块连接的约定规则模块连接的约定规则模块连接的参数传递方法模块连接的参数传递方法第11章模块化程序设计将程序分段、采用子程序或宏结构都是进行模将程序分段、采用子程序或宏结构都是进行模块化程序设计块化程序设计本节介绍开发大型程序时采用的方法:本节介绍开发大型程序时采用的方法:把源程序分放在几个文本文件中,在汇编时通把源程序分放在几个文本文件中,在汇编时通过包含伪指令过包含伪指令INCLUDE结合成一体结合成一体INCLUDE 文件

2、名文件名第11章源文件包含的操作步骤:源文件包含的操作步骤: 分别编辑生成各个文件分别编辑生成各个文件 汇编、连接主程序文件汇编、连接主程序文件把常用子程序写成独立的源程序文件,单独把常用子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件汇编,形成子程序的目标文件.OBJ主程序也经过独立汇编之后形成目标文件主程序也经过独立汇编之后形成目标文件连接程序将所有目标文件连接起来,最终产连接程序将所有目标文件连接起来,最终产生可执行文件生可执行文件需要遵循的原则:需要遵循的原则: 声明共用的变量、过程等声明共用的变量、过程等 实现正确的段组合实现正确的段组合 处理好参数传递问题处理好参数传递问

3、题目标代码文件的连接2声明共用的变量、过程各个模块间共用的变量、过程等要说明各个模块间共用的变量、过程等要说明PUBLIC 标识符标识符 ,标识符标识符.;定义标识符的模块使用定义标识符的模块使用EXTERN 标识符标识符:类型类型 ,标识符标识符:类型类型.;调用标识符的模块使用调用标识符的模块使用标识符是变量名、过程名等标识符是变量名、过程名等类型是类型是byte / word / dword(变量)或(变量)或near / far(过程)(过程)在一个源程序中,在一个源程序中,public/extern语句可以有多条语句可以有多条各模块间的各模块间的public/extern伪指令要互相

4、配对,并伪指令要互相配对,并且指明的类型互相一致且指明的类型互相一致第9章实现正确的段组合子程序文件必须定义在代码段中,也可以具有局部子程序文件必须定义在代码段中,也可以具有局部的数据变量的数据变量采用简化段定义格式,只要采用相同的存储模式,采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用容易实现正确的近或远调用完整段定义格式中,为了实现模块间的段内近调用完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,类型),各自定义的段名、类别必须相同,组合类型都是组合类型都是public。实际的程序开发中,各个模。实际的程序开发中,各个模块往

5、往由不同的程序员完成,不易实现段同名或类块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(别相同,所以索性定义成远调用(far类型)类型)定义数据段时,同样也要注意这个问题。当各个模定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段块的数据段不同时,要正确设置数据段DS寄存器寄存器的段基地址的段基地址第9章处理好参数传递问题少量参数可用寄存器或堆栈直接传送少量参数可用寄存器或堆栈直接传送数据本身数据本身大量数据可以安排在缓冲区,用寄存大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址器或堆栈传送数据的存储地址还可利用变量传递参数,但是

6、要采用还可利用变量传递参数,但是要采用public/extern声明为公共(全局)声明为公共(全局)变量变量这些也是子程序间的参数传递方法这些也是子程序间的参数传递方法第9章第11章什么是混合编程多种程序设计语言间,通过相互调用、多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程而形成程序的过程就是混合编程程序的大部分采用高级语言编写,以程序的大部分采用高级语言编写,以提高程序的开发效率;在某些部分,提高程序的开发效率;在某些部分,利用汇编语言编写,以提高程序的运利用汇编语言编写,以提高程序的运行效率行效率第11章混合

7、编程方法嵌入式汇编嵌入式汇编n在在C/C+语言中直接使用汇编语言语句,语言中直接使用汇编语言语句,n简洁直观、功能较弱简洁直观、功能较弱模块连接模块连接n两种语言分别编写独立的程序模块,分别两种语言分别编写独立的程序模块,分别产生目标代码产生目标代码OBJ文件,然后进行连接,文件,然后进行连接,形成一个完整的程序形成一个完整的程序n使用灵活、功能强,要解决参数传递问题使用灵活、功能强,要解决参数传递问题第11章混合编程的关键问题建立不同语言之间的接口建立不同语言之间的接口在不同格式的两种语言间提供有在不同格式的两种语言间提供有效的通讯方式,作出符合两种语效的通讯方式,作出符合两种语言调用约定的

8、某种形式说明,实言调用约定的某种形式说明,实现两种语言间的程序模块互相调现两种语言间的程序模块互相调用、变量的相互传送以及参数和用、变量的相互传送以及参数和返回值的正确使用返回值的正确使用第11章Turbo C嵌入式汇编方式格式格式asm 操作码操作码 操作数操作数 举例举例asm mov ax,ds;asm pop ax; asm pop ds; asm ret;asm push ds第11章若干注意事项操作码支持操作码支持8086/8087指令或若干伪指指令或若干伪指令:令:db/dw/dd和和extern 操作数是操作码可接受的数据:立即数、操作数是操作码可接受的数据:立即数、寄存器名,

9、还可以是寄存器名,还可以是C语言程序中的常语言程序中的常量、变量和标号等量、变量和标号等内嵌的汇编语句可以用分号内嵌的汇编语句可以用分号“;”结束,结束,也可以用换行符结束也可以用换行符结束 使用使用C的注释,如的注释,如 / * * /正确运用通用寄存器、标号等正确运用通用寄存器、标号等/ * LT602.C */#include void upper(char *dest,char *src)asm mov si,src/* dest和和src是地址指针是地址指针 */asm mov di,destasm cldloop: asm lodsb/* C语言定义的标号语言定义的标号 */asm

10、 cmp al,aasm jb copy/* 转移到转移到C的标号的标号 */asm cmp al,zasm ja copy/* 不是不是a到到z之间的字符原样复制之间的字符原样复制 */例例11.211.21/21/2asm sub al,20h /*小写字母转换成大写小写字母转换成大写*/copy: asm stosbasm and al,al/* C语言中,字符串用语言中,字符串用NULL(0)结尾)结尾 */asm jnz loopmain()/* 主程序主程序 */char str=This Started Out As Lowercase!;char chr100;upper(ch

11、r,str);printf(Origin string:n%sn,str);printf(Uppercase String:n%sn,chr);例例11.211.22/22/2第11章Turbo C模块连接的约定规则命名约定命名约定n汇编语言过程中被汇编语言过程中被C语言调用的语言调用的标识符前要标识符前要加上加上下划线下划线“_” 声明约定声明约定nC对调用的外部过程、变量等采用对调用的外部过程、变量等采用EXTERN说明说明n汇编语言程序的标识符用汇编语言程序的标识符用public操作符定义操作符定义寄存器使用约定寄存器使用约定存储模式约定存储模式约定n采用采用相同的存储模式相同的存储模式

12、参数传递约定:堆栈和共享变量参数传递约定:堆栈和共享变量; 汇编语言子程序:汇编语言子程序:lt903s.asmdata segmentmsgdb Hello, C and Assembly ! $data endscode segmentPUBLIC _display_display proc;过程名加有下划线过程名加有下划线mov ah,9mov dx,offset msg;寄存器寄存器AX和和DX无须保护无须保护int 21hret_display endpCode endsend例例11.311.31/21/2/* C语言程序:语言程序:lt903.c */extern void di

13、splay(void);/* 说明说明display是外部函数是外部函数 */main() display();例例11.311.32/22/2; 汇编语言子程序:汇编语言子程序:lt904s.asm.model small.codePUBLIC _min_minproc;小型模式,为近过程小型模式,为近过程push bpmov bp,spmov ax,bp+4;取第取第1个参数个参数cmp ax,bp+6 ;与第与第2个参数比较个参数比较jle minexitmov ax,bp+6 ;保存返回值保存返回值minexit: pop bpret_minendpend例例11.411.41/21/

14、2图示large688L/* C语言程序:语言程序:lt904.c */extern int min(int,int);main() printf(“%d”,min(100,200);小型模式编译程序和连接:小型模式编译程序和连接:TCC -ms -Iinclude -Llib lt904.c lt904s.obj大型模式编译程序和连接:大型模式编译程序和连接:TCC -ml -Iinclude -Llib lt904.c lt904l.obj例例11.411.42/22/2例11.4的堆栈区堆栈段堆栈段20091004偏移地址偏移地址2BP小型模式小型模式堆栈段堆栈段20081006段地址段

15、地址4偏移地址偏移地址2BPBPBPSPSP大型模式大型模式第11章Visual C的嵌入式汇编格式格式_ _asm 指令指令 举例举例int power2(int num,int power)_ _asmmov eax,nummov ecx,powershl eax,cl/ 返回返回 EAX=EAX(2CL)第11章模块连接的注意事项必须遵循共同的约定规则必须遵循共同的约定规则n命名约定命名约定n声明约定声明约定n寄存器使用约定寄存器使用约定n存储模式约定存储模式约定n参数传递约定参数传递约定采用一致的调用规范采用一致的调用规范声明共用函数和变量声明共用函数和变量正确传递入口参数和返回参数正

16、确传递入口参数和返回参数第11章32位汇编语言过程用用.386p等处理器伪指令说明采用的等处理器伪指令说明采用的指令集指令集32位逻辑段环境位逻辑段环境有些指令在有些指令在32位段与位段与16位段有差别位段有差别采用平展模式(采用平展模式(flat)汇编时采用选项汇编时采用选项/coff;汇编语言子程序:汇编语言子程序:lt614f.asm.386p.model flat,cPUBLIC power2.codepower2 procpush ebpmov ebp,espmov eax,ebp+8;取第取第1个参数个参数mov ecx,bp+12;取第取第2个参数个参数shl eax,clpop

17、 ebpret;返回返回EAXpower2 endpend例例11.1411.141/21/2图示/ C+语言程序:语言程序:lt914.cpp# include extern “c”int power2(int,int);void main(void) cout“2的的6次方乘次方乘5等于:等于:t”; coutpower2(5,6)endl;将汇编语言程序汇编成目标代码文件:将汇编语言程序汇编成目标代码文件:ML /c /coff lt614f.asm在在Visual C+6.0编译环境下创建项目,编译环境下创建项目,插入汇编成的目标代码文,然后编译连接插入汇编成的目标代码文,然后编译连接

18、例例11.1411.142/22/2如何简化利用堆栈如何简化利用堆栈的传递参数方法的传递参数方法例11.14的堆栈区堆栈段堆栈段61258EIP4EBPEBPEBPESPESP要调用带参数过程定义的过程,不应采用要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐指令,因为比较烦琐应该采用过程调用伪指令应该采用过程调用伪指令INVOKE使用使用INVOKE伪指令的前提是需要用伪指令的前提是需要用PROTO伪指令对过程进行声明伪指令对过程进行声明带参数过程的定义、声明和调用过程名过程名 PROC调用距离调用距离 语言类型语言类型 作用范围作用范围 USES 寄存器列表寄存器列表, 参数

19、参数:类型类型LOCAL 参数表参数表;汇编语言语句汇编语言语句过程名过程名 ENDP第9章过程声明伪指令:过程声明伪指令:用于事先声明过程的结构用于事先声明过程的结构过程名过程名PROTO 调用距离调用距离 语言类型语言类型, 参数参数:类型类型过程调用伪指令过程调用伪指令INVOKE 过程名过程名,参数参数,.如何调如何调用用;汇编语言程序:汇编语言程序:lt915.asm.model smallchecksumd PROTO c,countp:word,arrayp:word;声明过程声明过程.stack 256.dataarraydb 12h,25h,0f0h,0a3h,3db 68h

20、,71h,0cah,0ffh,90hcountequ $-array;数组的元素个数数组的元素个数resultdb ?;校验和校验和.code.startupINVOKE checksumd,count,offset array;调用过程调用过程mov result,al;保存校验和保存校验和.exit 0例例9.159.151/21/2对比checksumd PROC c USES bx cx,countp:word,arrayp:wordmov bx,arrayp;BX数组的偏移地址数组的偏移地址mov cx,countp;CX数组的元素个数数组的元素个数xor al,alsumd: ad

21、d al,bx;求和:求和:ALAL+DS:BXinc bxloop sumdretchecksumd endpend例例11.1511.152/22/2对比;lt915.asm的列表文件(的列表文件(lt915.lst).INVOKE checksumd,count,offset array *mov ax,word ptr OFFSET array *push ax *mov ax,+000Ah *push ax *call checksumd *add sp,04hmov result,al.例例9.159.151/21/2指示该语句由汇编程序自动生成指示该语句由汇编程序自动生成chec

22、ksumd PROC c USES bx cx,countp:word,arrayp:word *push bp;起始代码起始代码 *mov bp,sp *push bx;保护保护bx和和cx *push cxmov bx,arrayp;arrayp=BP+6mov cx,countp;cuontp=BP+4.ret *pop cx;结尾代码结尾代码 *pop bx *pop bp *ret 0000hchecksumc endp例例11.1511.152/22/2进入调试程序观察进入调试程序观察;汇编语言子程序:汇编语言子程序:lt916s.asm.model small,c;采用采用C语言

23、类型语言类型public min.codeminproc ,var1:word,var2:wordmov ax,var1;取第取第1个参数个参数var1cmp ax,var2;与第与第2个参数个参数var2比较比较jle minexitmov ax,var2;保存返回值保存返回值minexit: retminendpend例例11.1611.16对比供供C语言主程序调用语言主程序调用;汇编语言子程序:汇编语言子程序:lt917f.asm.386p.model flat,cPUBLIC power2.codepower2 PROC ,num:dword,power:dwordmov eax,nu

24、m;获取参数获取参数mov ecx,powershl eax,cl;计算计算ret;EAX存放返回值存放返回值power2 ENDPend例例11.1711.17对比供供C+主程序调用主程序调用/ C+程序:程序:LT918.CPP #include extern C long isum(int,int *);int imin(int,int *);void main(void) const int SIZE=10; int arraySIZE; int temp; cout请输入请输入10个整数:个整数:endl; for(temp=0;temparraytemp; coutendl; cout整数数据之和:整数数据之和:tisum(SIZE,array)endl; cout其中最小值为:其中最小值为:timin(SIZE,array)endl;例例11.1811.181/41/4/求求itmp个元素的数组个元素的数组iarray的最小数的最小数int imin(int itmp,int iarray)_asm mov ecx,itmpje

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论