汇编语言与程序设计.ppt

上传人:牧羊曲112 文档编号:6586383 上传时间:2023-11-15 格式:PPT 页数:99 大小:319.50KB
返回 下载 相关 举报
汇编语言与程序设计.ppt_第1页
第1页 / 共99页
汇编语言与程序设计.ppt_第2页
第2页 / 共99页
汇编语言与程序设计.ppt_第3页
第3页 / 共99页
汇编语言与程序设计.ppt_第4页
第4页 / 共99页
汇编语言与程序设计.ppt_第5页
第5页 / 共99页
点击查看更多>>
资源描述

《汇编语言与程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言与程序设计.ppt(99页珍藏版)》请在三一办公上搜索。

1、第5章 汇编语言与程序设计,本章学习要点,1、INTEL 8086 微处理器的寄存器和主存储器2、汇编语言语句格式3、8086 的指令系统及寻址方式4、8086 汇编语言的数据、表达式和运算符 5、8086 汇编语言的伪指令6、汇编语言程序设计技术7、汇编与C/C+接口,5.1 概述,程序设计语言通常分为3类:机器语言(Machine Language)汇编语言(Assembler Language)高级语言(High Level Language)。1机器语言(1)机器指令机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作对象(数据或数据地址)。,基本概念,(2)指令系统和机器

2、语言指令系统是指特定计算机上机器指令的集合。机器语言是由指令系统以及机器指令的使用规则构成的。机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计算机才能直接执行。(3)机器语言的主要特点机器语言主要具有下列两个特点:机器语言与机器密切相关 机器语言设计程序非常困难,但容易实现高性能,2 汇编语言,以助记符描述的指令称作汇编格式指令或符号指令,通常简称指令。指令和伪指令的集合及其程序设计规则便构成了汇编语言。用汇编语言编写的程序就是汇编语言源程序。,5.2 INTEL8086寄存器和主存储器,8086通用寄存器 8086的标志寄存器 存储器组织与段寄存器,5.2.1.8086通用寄存

3、器,5.2.2 8086的标志寄存器,8086CPU中有一个16位标志寄存器,由6位条件码标志(flag)和3位控制标志构成.,5.2.3 存储器组织与段寄存器,数据类型,【例5.1】各独立段的分配情况示例。,设CS=B000H、DS=1CDEH、SS=4200H、ES=0150H,它们分别为代码段、数据段、堆栈段和附加段的段首址。自每个段首址开始,各段均占64KB的范围,各段之间互不重叠。如图所示。,5.3 汇编语言语句格式,汇编语言源程序由语句序列构成。每条语句一般占一行,分表达硬指令的执行性语句和表达伪指令的说明性语句两种格式。语句一般由分隔符分成的四个部分组成,它们有两种格式:执行性语

4、句由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:标号:硬指令助记符 操作数,操作数,.;注释说明性语句由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:名字 伪指令助记符 参数,参数,.;注释,5.3.1.段定义的简化,在MASM 5.0及以上版本中,段的定义可以非常简单,方便了程序设计。使用简化段定义伪指令前,必须先说明用户程序使用的内存模式。内存模式定义伪指令MODEL内存模式指用户程序的代码和数据的存放格式,及他们占用内存的大小。.MODEL,语言类型,操作系统类型,堆栈类型,简化的段定义1.简化段定义伪指令,简化段定义伪指令在.MODEL 语句之后,如下所列。每

5、个简化段伪指令都可用来表示一个段的开始,同时也说明前一个段结束。.STACK长度;定义堆栈段,长度缺省值为1KB.CODE名字;定义代码段.DATA;定义数据段.DATA?;定义数据段,初值不确定.FARDATA名字;定义远调用数据段.FARDATA?名字;定义远调用数据段,初值不确定.CONST;定义只读常数数据段.STARTUP;程序起始点,并初始化DS、SS.EXIT 0;程序结束点,返回操作系统上述简化段定义伪指令中带方括号的项可省略。伪指令.EXIT 0相当于MOV AX,4C00H和INT 21H两条指令。,2.缺省段名,完整的段定义,使用完整的段定义伪指令来定义一个段,可具体控制

6、汇编程序MASM和连接程序LINK在内存中组织代码和数据的方式。整个逻辑段必须用段定义语句括起来。SEGMENTENDS伪指令 SEGMENT 定位类型 组合方式 段长度 分类名 段体 ENDS,5.3.4 源程序编程格式,1.EXE文件编程格式该格式下源程序允许使用多个逻辑段,适合编写大型程序,汇编-连接后生成扩展名为.EXE的可执行文件。2.COM文件编程格式该格式只允许源程序设置一个代码段(堆栈在代码段内),代码段的目标模块要小于64KB,适合编写中小程序。在.MODEL TINY伪指令定义的内存模式下即可生成.COM结构的源程序。,返回操作系统方式,1使用功能号为4CH的DOS功能调用

7、,2将主程序定义为远过程,3利用20H号BIOS中断调用,4利用0号DOS系统功能调用,建立汇编语言的工作环境,为运行汇编语言程序至少要在磁盘上提供以下文件:1.编辑程序文件,如EDIT.EXE。2.汇编程序文件,如MASM.EXE。3.连接程序文件,如LINK.EXE。4.调试程序文件,如DEBUG.COM。必要时,还可建立如CREF.EXE和EXR2BIN.EXE等文件。,汇编语言源程序上机过程,在计算机上运行汇编语言程序的步骤是:1.用编辑程序建立ASM源文件;2.用MASM程序把ASM文件转汇编成OBJ文件;3.用LINK程序把OBJ文件转连接成EXE文件;4.用DOS命令直接键入文件

8、名就可执行该程序。,5.4 8086 的指令系统及寻址方式,8086 CPU的指令系统的基本指令包括数据传送类指令、算术运算类指令、位操作类指令、串操作类指令、控制转移类指令、处理机控制类指令。,5.4.1 指令中操作数的符号说明,计算机中的一条指令通常包含两部分:,操作码,操作数,5.4.2 三类操作数的寻址方式,寻找指令中所需操作数存放地址的方式或程序转移时寻找转移地址的方式称为寻址方式。因而寻址方式分为两大类,一类是数据寻址方式,另一类是转移地址寻址方 式。由于80X86指令涉及四种操作数:立即操作数、寄存器操作数、存储器操作数和隐含操作数,因此,数据寻址方式又可对应四种寻址方式,即:立

9、即寻址、寄存器寻址、存储器寻址和固定寻址。本节只介绍前三种。,5.4.3 数据传送类指令,8086指令系统按功能可分为六大类:数据传送类指令、算术运算类指令、位操作指令、串操作指令、控制转移指令、处理器控制指令。8086指令按操作数个数可划分为三种类型:双操作数指令、单操作数指令、无操作数指令。,1通用数据传送指令,(1)传送指令MOV(2)查表转换指令XLAT,2地址传送指令,(1)传送有效地址指令LEA(2)传送偏移地址及数据段首址指令LDS(3)传送偏移地址及附加段首址指令LES,3标志位传送指令,(1)标志送AH指令LAHF(2)AH标志送指令SAHF(3)标志进栈指令PUSHF(4)

10、标志出栈指令POPF,4.堆栈操作指令,(1)进栈指令PUSH(2)出栈指令POP,算术运算类指令,8086的算术运算类指令能够对二进制或十进制(BCD码)数进行加、减、乘、除运算,操作数的数据形式可以是8位或16位的无符号数或带符号数。对于单操作数指令,不允许使用立即数形式;对于双操作数指令,只有源操作可以使用立即数,两个操作数中必须有一个在寄存器中。,1.加法运算指令,(1)加法指令ADD(2)带进位加法指令ADC(3)加1指令INC,2.减法运算指令,(1)减法指令SUB(2)带借位减法指令SBB(3)减1指令DEC(4)求负数指令NEG(5)比较指令CMP,3.乘法运算指令,(1)无符

11、号数乘法指令MUL(2)有符号数乘法指令IMUL,4.除法运算指令,(1)无符号数除法指令DIV(2)有符号除指令IDIV,5.符号扩展指令,(1)字节转换成字指令CBW(2)字转换成双字指令CWD,6.十进制算术运算调整指令,(1)非压缩BCD码调整指令(2)压缩BCD码调整指令,逻辑运算类指令,8086提供的位操作指令包括逻辑运算指令和移位指令,这类指令可直接对寄存器或存储器中的位进行操作。逻辑运算指令包括:AND指令、OR指令、XOR指令、TEST指令和NOT指令,其中前四种指令是双操作数指令,符合双操作数指令的一般规律,这四条指令执行后将使CF和OF位为0,AF位不确定,而SF、ZF和

12、PF位则根据运算结果设置;NOT指令是单操作数指令,符合单操作数指令的一般规律,它的执行不影响标志位。,1.逻辑与指令,格式:AND OPD,OPS功能:将目的操作数与源操作数按位相与,结果送目的操作数。即:OPD(OPD)(OPS)。,2.逻辑或指令,格式:OR OPD,OPS功能:将目的操作数与源操作数按位相或,结果送目的操作数。即:OPD(OPD)(OPS)。,3.逻辑异或指令,格式:XOR OPD,OPS功能:将目的操作数与源操作数按位相异或,结果送目的操作数。即:OPD(OPD)(OPS)。,4.测试指令,格式:TEST OPD,OPS功能:目的操作数与源操作数按位相与,结果反映在标

13、志位上,但不送回目的操作数。即:(OPD)(OPS),5.逻辑非指令,格式:NOT OPD功能:将目的操作数各位取反,结果送目的操作数。即:OPD(OPD),移位操作类指令,移位指令包括逻辑移位指令、算术移位指令和循环移位指令。这些指令都对目的操作数按操作符规定的方式向左或向右移动指定位数的操作。这些指令均有统一的语句格式:标号:操作符OPD,1或 标号:操作符OPD,CL,(1)逻辑左移指令(2)算术左移指令(3)逻辑右移指令(4)算术右移指令(5)循环左移指令ROL(6)循环右移指令ROR(7)带进位的循环左移指令RCL(8)带进位的循环右移指令RCR,串操作类指令,串操作指令中,源操作数

14、用寄存器SI寻址,默认在数据段DS中,但允许段超越;目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越。每执行一次串操作指令,作为源地址指针的SI和作为目的地址指针的DI将自动修改:1(对于字节串)或2(对于字串)。地址指针是增加还是减少则取决于方向DF标志。在系统初始化后或者执行指令CLD指令后,DF=0,此时地址指针增1或2;在执行指令STD指令后,DF=1,此时地址指针减少1或2。,1传送指令MOVS2.往目的串中存数指令STOS 3.从源串中取数指令LODS4.串比较指令CMPS 5.串搜索指令SCAS6重复前缀指令REP/REPZ/REPNZ,控制转移类指令及其寻址方式,I

15、ntel 8086中,程序的执行序列是由代码段寄存器CS和指令指针IP确定的。CS包含当前指令所在代码段的段地址,IP则是要执行的下一条指令的偏移地址。程序的执行一般是以指令序列顺序执行,但有时需要改变程序的流程。控制转移类指令通过修改CS和IP寄存器的值来改变程序的执行顺序,包括5组指令:无条件转移指令,有条件转移指令,循环指令,子程序指令和中断指令。,1.控制转移指令,(1)控制转移指令(2)无条件转移指令(3)条件转移指令(conditional jump),2.指令寻址方式,(1)段内直接寻址(2)段间直接寻址(3)段内间接寻址(4)段间间接寻址,处理机控制类指令,处理机控制类指令用来

16、控制各种CPU的操作,如暂停、等待或空操作等。,汇编语言的指令语句和伪指令语句操作数一般为常量、变量、标号、表达式。,5.5 8086 汇编语言的数据、表达式和运算符,常数,常量是没有任何属性的纯数值,它的值在汇编期间已能完全确定,且在程序运行中也不会发生变化。常量分为数值常量、字符串常量和符号常量,它主要用于指令语句中的立即数或伪指令语句中给变量赋初值等。,1.数值常量2.字符串常量3.符号常量,变量,在汇编语言中,变量是一个数据存储单元的名称,即数据存放地址的符号表示。它代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以改变。为方便访问变量,在程序中通过变量名来使用变量。,变量,

17、变量名-为用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。变量名可以没有,这种情况,汇编程序将直接为初值表分配空间,无符号地址。设置变量名是为了方便存取它指示的存储单元。初值表-是用逗号分隔的参数,主要由数值常数、表达式或?、DUP组成。其中?表示初值不确定,即未赋初值;重复初值可以用DUP进行定义。DUP的格式为:重复次数 DUP(重复参数)变量定义伪指令-有DB/DW/DD/DF/DQ/DT,它们根据申请的主存空间单位分类。,标号,标号是一条指令语句的符号地址,在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在控制转移指令中直接

18、引用这个标号。标号一般在代码段中定义和引用。由于标号代表了指令的符号地址,所以标号也有3个属性:段属性(SEG):标号的段属性是指标号定义所在段的段首地址。偏移属性(OFFSET):标号的偏移属性是指标号所在段的段首地址到该标号的字节距离。类型属性(TYPE):标号的类型属性表示了它的转移特性,即该标号是作为段内还是段间转移(或调用)指令的目标地址。标号的类型属性有2种:NEAR类型和FAR类型。,表达式与运算符,1.数值表达式2.地址表达式(1)属性运算符(2)数值返回运算符(3)分离运算符(4)其他运算符,5.6 8086 汇编语言的伪指令,伪指令又称为伪操作,伪指令是汇编语言程序设计的一

19、个重要部分,由于汇编程序在汇编过程中无法区分源程序中的分段情况,哪些是数据,哪些是指令,也无法识别数据的类型,以及源程序在哪结束,因此,80X86宏汇编语言提供了多种伪指令,它主要告诉汇编程序如何正确地将汇编源程序汇编成目标程序。,5.6.1 数据定义及存储器分配伪指令,常用的数据定义伪指令有DB、DW、DD、DQ、DT。它们的定义如上节所示。格式:变量 数据定义伪指令 表达式,表达式,功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。,5.6.2 表达式赋值伪指令,1等价伪指令EQU格式:符号名 EQU 表达式功能:为常量或表达式及其它各种符号定义一个等价的符号名,但它不申请

20、分配存储单元。,2等号伪指令格式:符号名=表达式功能:该语句的功能与EQU语句类似,不同的是等号伪指令能对所定义的符号名多次重新定义,且以最后一次定义的值为准。,5.6.3 段定义伪指令,编制一个80X86汇编语言源程序,段是基础,这有两方面含义:一是必须按段来构造程序,二是在程序执行时,要凭借四个段寄存器对各个段的存储单元进行访问。段结构伪指令主要有两条语句,即段定义伪指令和假定伪指令。,1段定义伪指令SEGMENT/ENDS格式:段名 SEGMENT 定位类型 组合类型 类别 段体 段名 ENDS功能:定义一个逻辑段,指定段的名字和范围,段在内存中的起始位置、段与段之间的连接关系。,2假定

21、伪指令ASSUME假定伪指令主要用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的对应关系。格式:ASSUME 段寄存器名:段名,段寄存器名:段名,5.6.4 程序开始和结束伪指令,1源程序开始伪指令(1)NAME伪指令(2)TITLE伪指令2源程序结束伪指令格式:END 地址表达式 功能:该语句为源程序的最后一个语句,用以标志整个程序的结束,即告诉汇编程序汇编工作到此结束。,5.6.5 过程定义伪指令,在程序设计中,经常将一些重复出现的语句组定义为子程序。子程序又称为过程,可以采用CALL指令来调用。使用格式:过程名 PROC NEAR/FAR(语句系列)RET(语句系列)过程名 EN

22、DP调用一个过程的格式为:CALL 过程名,5.6.6 宏指令,在编写汇编语言程序的过程中,有时某个程序段要出现许多次,有时只是参数不同,但功能完全一样,则这样的程序段可以定义成一个指令,并且称它为宏指令。,1.宏的定义,宏定义由一对宏汇编伪指令MACRO/ENDM来完成:宏名 MACRO 形参表 宏定义体 ENDM,2.宏的调用,(1)宏调用在汇编语言中使用已定义过的宏指令,称为宏调用。按照宏指令定义的格式,宏调用也可分为两种格式。无参数宏调用:宏指令名带参数宏调用:宏指令名 实参1,实参2,,宏展开,当宏汇编程序扫描到宏指令语句(即宏调用)时,宏汇编程序就把宏指令定义中宏体的程序段代码替代

23、宏指令语句。若是带参数的宏调用,则同时用相应的实参替代宏体中对应形参的位置,并对原有宏体代码作修改。下面是一个源程序的列表文件,它展示了宏定义、宏调用和宏展开的全部过程。,3.常用宏操作符,&替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符。字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整。,常用宏操作符,!转义操作符,用于指示其后的一个字符作为一般字符,而不含特殊意义。%表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,

24、而不是将表达式本身作为参数。;宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现。,4.宏的参数,宏的参数功能强大,即可以无参数,又可以带有一个或多个参数;而且参数的形式非常灵活,可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式。,5.宏汇编中的伪指令,(1)MACRO和ENDM在前面的宏指令的定义中已经介绍过,这是宏操作时必不可少的指令,而且成对出现。(2)PURGEPURGE的功能是取消多个宏定义,即一个宏指令定义可以用伪指令PURGE来取消,然后就再重新定义。格式:PURGE 宏指令名1,宏指令名2取消宏定义的含义是使该宏定义成为空,程序中如

25、果出现一个已被取消宏定义的宏调 用,则汇编程序将不会指示出错,但它将忽略该宏调用,当然也不会予以展开。,5.7 汇编语言程序设计技术,在汇编语言程序设计中,程序有顺序、分支、循环和子程序四种基本结构形式。,5.7.1 源程序设计步骤,1.用编辑程序(EDIT.EXE或WPS.EXE等)建立ASM源文件(文件名ASM)。2.用汇编程序(MASM.EXE或ASM.EXE)对源文件进行汇编,如有错误,再回到第1步进行修改,直到无语法错误,产生目标文件(文件名OBJ)。3.用连接程序(LINK.EXE)把目标文件转换为可执行文件(文件名EXE)。4.用调试程序(DEBUG.COM)对可执行文件进行调试

26、,如发现错误,再进行第1-4步骤,对源程序进行修改、汇编、连接和调试,直到无错误为止。此时的可执行文件在DOS命令下可直接执行。,5.7.2 顺序程序设计,顺序程序设计也称为简单程序设计,这种结构的程序不使用分支、循环结构,程序本身的逻辑非常简单,所以只能完成一些简单操作。其特点是程序顺序执行,由前向后逐条执行指令。,5.7.3 分支程序设计,分支程序结构有两种形式:二分支程序结构和多分支程序结构。程序的分支一般是通过执行转移指令来实现的。,5.7.4 循环程序设计,当需要重复执行某段程序时,就可以利用循环程序结构。循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体,条件永真或无条

27、件的重复循环就是逻辑上的死循环(永真循环、无条件循环)。循环程序结构是满足一定条件的情况下,重复执行某段程序。1.循环程序的组成一个循环程序通常由以下5个部分组成:(1)初始化部分(2)工作部分(3)修改部分(4)控制部分(5)结束处理部分,5.7.5 子程序设计,把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率。主程序(调用程序)需要利用CALL指令调用子程序(被调用程序)。子程序需要利用RET指令返回主程序。,5.7.6 系统功能调用,汇编程序提供给汇编语言程序员的功能非常有限,程序员需要

28、利用ROM-BIOS和操作系统提供的资源,系统功能调用是程序设计的一个重要方面。通常按照如下4个步骤进行:在AH寄存器中设置系统功能调用号。在指定寄存器中设置入口参数。用中断调用指令(INT i8)执行功能调用。根据出口参数分析功能调用执行情况。,5.7.7 汇编语言程序的开发,1.源程序的开发流程一般汇编语言的上机过程是首先用某一个文本编辑器形成一个以ASM为扩展名的源程序文件,然后用汇编程序翻译源程序,将ASM文件转换为OBJ模块文件,最后用连接程序将一个或多个目标文件链接成一个可执行文件。2.源程序的编辑源程序文件的形成(编辑)可以通过任何一个文本编辑器实现。例如,DOS中的全屏幕文本编

29、辑器EDIT,或读者已经熟悉的其他程序开发工具中的编辑环境(象Turbo C),也可以采用Windows的记事本NOTEPAD.EXE。注意源程序文件要以ASM为扩展名。,汇编语言程序的开发,3.源程序的汇编汇编是将源程序翻译成由机器代码组成的目标模块文件的过程。MASM 6.x提供的汇编程序是ML.EXE。进入已建立的程序所在目录,键入如下命令及相应参数即可以完成源程序的汇编:ML/c lt301a.asm。如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(lt301a.obj),否则MASM将给出相应的错误信息。这时应根据错误信息,重新编辑修改源程序后,再进行汇编。注意,仅利用

30、ML实现源程序的汇编,参数/c(小写字母c)是必须有的;否则,ML将自动调用连接程序LINK.EXE进行连接。,汇编语言程序的开发,4.目标文件的连接连接程序能把一个或多个目标文件和库文件合成一个可执行文(.EXE、.COM文件)。在程序目录下有了lt301a.obj文件,键入如下命令实现目标文件的连接:LINK lt301a.obj如果不带文件名,LINK连接程序将提示输入OBJ文件名,它还会提示生成的可执行文件名以及列表文件名,一般采用缺省文件名就可以。如果没有严重错误,LINK将生成一个可执行文件(lt301a.exe);否则将提示相应的错误信息,这时需要根据错误信息重新修改源程序后再汇

31、编、链接,直到生成可执行文件。ML汇编程序可以自动调用LINK连接程序,实现汇编和连接的依次进行。ML汇编程序还可以生成列表文件和影像文件。,汇编语言程序的开发,5.可执行程序的调试经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行。操作系统装载该文件进入主存,开始运行。如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误。利用调试程序可以观察寄存器值、数据所在的,5.8 汇编与C/C+接口,C功能强大,产生的代码效率高,是目前最流行的编程语言之一。但是效率最高的语言不是C/C,而是汇编语言。只不过C/C比起汇编语言来易移植,容易学习;汇编语言比C/C功能更强大

32、,冗余更少。因此,许多软件可以兼顾二者的优点,用C/C和汇编语言混合编程。混合编程主要要解决的问题是二者的接口和参数传递,参数传递包括值传递、指针传递、引用传递等。,5.8.1 C/C+程序中内嵌汇编,1.嵌入汇编语句的格式Turbo C语言程序中,嵌入汇编语言指令是在汇编语句前加一个asm关键字,格式如下:asm操作码操作数,2.访问C语言的数据,内嵌的汇编语句除可以使用指令允许的立即数、寄存器名外,还可以使用C语言程序中的任何符号(标识符),包括变量、常量、标号、函数名、寄存器变量、函数参数等;C编译程序自动将它们转换成相应汇编语言指令的操作数,并在标识符名前加下划线。一般来说,只要汇编语

33、句能够使用存储器操作数(地址操作数),就可以采用一个C语言程序中的符号;同样,只要汇编语句可以用寄存器作为合法的操作数,就可以使用一个寄存器变量。,【例5.10】用嵌入汇编方式实现取两数较小值的函数min,/*LT701.C*/int min(int var1,int var2)/*用嵌入汇编语句实现的求较小值*/asm mov ax,var1 asm cmp ax,var2 asm jle minexit asm mov ax,var2minexit:return(_AX);/*将寄存器AX的内容作为函数的返回值*/main()/*C语言主程序*/min(100,200);,3.嵌入汇编的编

34、译过程,C语言程序中含有嵌入式汇编语言语句时,C编译器首先将C代码的源程序(.c)编译成汇编语言源文件(.asm),然后激活汇编程序Turbo Assembler将产生的汇编语言源文件编译成目标文件(.obj),最后激活Tlink将目标文件链接成可执行文件(.exe)。,4.命名约定,在C语言程序中,C对所要调用的外部过程、函数、变量均采用EXTERN予以说明,并且放在主调用程序之前,一般放在各函数体外部,说明形式如下:extern返回值类型函数名称(参数类型表);extern变量类型变量名;,5.声明约定,在C语言程序中,C对所要调用的外部过程、函数、变量均采用EXTERN予以说明,并且放在

35、主调用程序之前,一般放在各函数体外部,说明形式如下:extern返回值类型函数名称(参数类型表);extern变量类型变量名;,6.寄存器使用约定,作为一个独立的汇编语言子程序,当然要注意寄存器的保护和恢复。对于BP、SP、DS、CS和SS,汇编语言子程序如果要使用它们,并且有可能改变它们的值,Turbo C要求进行保护。这些寄存器经保护后,可以利用,但退出前必须加以恢复。寄存器AX、BX、CX、DX和ES,在汇编语言子程序中通常可以任意使用。其中的AX和DX寄存器承担了传递返回值的任务。标志寄存器也可以任意改变。,7.存储模式约定,存储模式处理程序、数据、堆栈在主存中的分配和存取,决定代码和

36、数据的默认指针类型,例如段寄存器CS、DS、SS、ES的设置就与所采用的存储模式有关。存储模式在C语言中也称为编译模式或主存模式。Turbo C提供了六种存储模式,分别是:微型模式(Tiny)、小型模式(Small)、紧凑模式(Compact)、中型模式(Medium)、大型模式(Large)和巨型模式(Huge)。,8.编译和连接过程,按照前面所论述的各种约定,让我们编写一个C语言程序调用汇编语言子程序的简单例子,这里没有参数传递的问题。,5.8.2 独立汇编模块的汇编与C/C+混合编程,两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序。使用灵活、

37、功能强,要解决参数传递问题。混合编程的关键问题是建立不同语言之间的接口,在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用。,1.模块连接的注意事项,必须遵循共同的约定规则:命名约定、声明约定、寄存器使用约定、存储模式约定、参数传递约定、采用一致的调用规范、声明共用函数和变量、正确传递入口参数和返回参数。,2.汇编和C的相互调用可以分以下几种情况:,(1)汇编程序中访问c程序中的变量和函数。(2)c程序中访问汇编程序中的变量(3)在线汇编,3.汇编语言程序调用C程序的原则,为了使C函数对汇

38、编语言程序可见,汇编语言程序需要对所调用的C语言函数、变量用关键字EXTERN进行说明,形式如下:EXTERN被调用函数名函数属EXTERN变量名变量属性,4.嵌入汇编语言的格式,C+语言是C语言的超集,它是在C语言的基础上扩展形成的面向对象程序设计语言。微软Visual C+5.06.0则是Windows 9.x平台上广泛应用的开发系统。本节以Visual C+5.06.0为例,说明32位Windows 9.x环境下汇编语言与C+的混合编程。它也分为嵌入汇编和模块调用两种方式。Visual C+直接支持嵌入汇编方式,不需要独立的汇编系统和另外的连接步骤。所以,嵌入式汇编比模块连接方式更简单方便。Visual C+的嵌入汇编方式与其他CC+编译系统的基本原理是一样的,当然有些细节的差别。嵌入汇编指令采用_asm关键字(注意,_asm前是两个下划线;但Visual C+5.06.0也支持一个下划线的格式_asm,目的是与以前版本保持兼容)。,本章小结,本章首先介绍用汇编语言进行程序设计所需要了解的基本知识,简述了INTEL 8086 微处理器组成、汇编语言语句格式、8086 的指令系统及寻址方式、8086 汇编语言的数据、表达式和运算符,以及作为辅助汇编的命令伪指令,然后,就程序设计的结构论述了汇编语言的各种程序设计方法,举例阐述汇编语言与C/C+语言的混合编程。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号