微机原理及其应用第4章

上传人:M****1 文档编号:569947289 上传时间:2024-07-31 格式:PPT 页数:324 大小:2.40MB
返回 下载 相关 举报
微机原理及其应用第4章_第1页
第1页 / 共324页
微机原理及其应用第4章_第2页
第2页 / 共324页
微机原理及其应用第4章_第3页
第3页 / 共324页
微机原理及其应用第4章_第4页
第4页 / 共324页
微机原理及其应用第4章_第5页
第5页 / 共324页
点击查看更多>>
资源描述

《微机原理及其应用第4章》由会员分享,可在线阅读,更多相关《微机原理及其应用第4章(324页珍藏版)》请在金锄头文库上搜索。

1、8086CPU8086CPU的指令系统的指令系统与汇编语言程序设计与汇编语言程序设计第四章 本章内容本章内容本章内容本章内容 指令的基本概念和指令所包含的指令的基本概念和指令所包含的 基本内容。基本内容。 80868086指令的格式及编码方式。指令的格式及编码方式。 80868086指令的寻址方式及寻址过程。指令的寻址方式及寻址过程。 80868086指令系统的分类、功能及操指令系统的分类、功能及操 作过程,每条指令的格式及用法。作过程,每条指令的格式及用法。 汇编语言程序的格式汇编语言程序的格式 汇编语言程序的上机过程汇编语言程序的上机过程 伪指令语句伪指令语句 汇编语言程序设计的基本方法汇

2、编语言程序设计的基本方法 本章内容本章内容本章内容本章内容学习目的学习目的学习目的学习目的 掌握指令及指令系统的基本概念。掌握指令及指令系统的基本概念。 掌握掌握8086各种寻址方式所执行的数各种寻址方式所执行的数 据寻址过程。据寻址过程。牢固地掌握存储器段地址:偏移地牢固地掌握存储器段地址:偏移地 址的组织结构和段约定的基本概念。址的组织结构和段约定的基本概念。 掌握每条掌握每条8086指令的格式、功能及用法。指令的格式、功能及用法。掌握指令的操作过程中操作数的变化情掌握指令的操作过程中操作数的变化情 况以及对标志位的影响。况以及对标志位的影响。 学会正确选用指令完成简单的任务。学会正确选用

3、指令完成简单的任务。学习目的学习目的学习目的学习目的 了了解解汇汇编编语语言言程程序序的的基基本本格格式式,及及其其上上机过程。机过程。 熟熟练练掌掌握握数数据据定定义义伪伪指指令令、段段定定义义伪伪指指令、符号定义伪指令、过程定义伪指令。令、符号定义伪指令、过程定义伪指令。 熟熟练练掌掌握握汇汇编编语语言言程程序序设设计计的的一一般般步步骤骤以以及及顺顺序序程程序序、分分支支程程序序、循循环环程程序序、子程序设计的方法。子程序设计的方法。学习目的学习目的学习目的学习目的4.1 4.1 8086CPU的指令格式与寻址方式的指令格式与寻址方式 4.1.1 4.1.1 指令的基本概念指令的基本概念

4、指令的基本概念指令的基本概念 指指令令通通常常以以二二进进制制代代码码的的形形式式提提供供给给计计算算机机,这种指令称为机器指令这种指令称为机器指令。例例:1000100011011000就是一条2字节的机器指令,指示计算机执行:“把寄存器BL内容复制到寄存器AL之中”的操作。表示为:ALBL。指令:指示计算机执行什么操作的命令命令。指令系统指令系统指令系统指令系统 (Instruction System):(Instruction System): 程序程序程序程序 (Program): (Program): 完成某个特定任务而编制的一系列指令的有序有序集合。程程序序的的执执行行一一般般是是

5、按按指指令令的的先先后后次次序序一一条条一一条条执执行行,但但遇遇到到转转移移类类指指令令时时则则可可能能改改变变指指令令的的执行次序。执行次序。计算机所能执行的全部全部指令指令。4.1.2 4.1.2 指令包含的基本内容及格式指令包含的基本内容及格式指令包含的基本内容及格式指令包含的基本内容及格式1. 1. 1. 1. 做什么操作做什么操作做什么操作做什么操作由指令的操作码操作码字段规定。2. 2. 2. 2. 操作数的来源操作数的来源操作数的来源操作数的来源操作数来自于什么地方。由指令的操操作作数数字段规定。操作数的来源可以是:操作数的来源可以是:a.CPU内的某个寄存器寄存器;b.存储器

6、内的某一个或几个单元单元;c.I/O端口端口;d.立即数。3. 3. 3. 3. 操作结果的去向操作结果的去向操作结果的去向操作结果的去向操作的结果结果将存放在何处。4. 4. 4. 4. 下一条指令的位置下一条指令的位置下一条指令的位置下一条指令的位置指示下一条指令是顺序顺序执行还是转移转移执行。指令的表示方法指令的表示方法指令的表示方法指令的表示方法1. 二进制代码表示二进制代码表示机器语言指令机器语言指令2. 助记符表示助记符表示汇编语言指令汇编语言指令例:1000100011011000例:MOVAL,BLMOV表示“传传送送”助记符,BL(寄存器)表示结果存放的位置,AL(寄存器)表

7、示数据的来源。助记符表示的指令便于书写、理解和记忆,但最终必须将助记符指令“翻译”成机器指令才能被识别和执行。这个过程叫“汇编”。助记符指令助记符指令机器指令机器指令汇编汇编8086CPU8086CPU指令的格式指令的格式指令的格式指令的格式操作码操作码 操作数操作数,操作数操作数 ;注释注释操作数的分类:操作数的分类:a.立即数立即数操作数;b.寄存器寄存器操作数操作数;c.存储器存储器操作数操作数。4.1.3 8086 CPU4.1.3 8086 CPU的寻址方式的寻址方式的寻址方式的寻址方式地址地址:数据和指令存放的位置。数据存放的位置可以是寄寄存存器器、存存储储器器或I/OI/O端端口

8、口,指令存放的位置只能是存储器中的代码段代码段。寻址方式:寻址方式:寻找指令地址和操作数地址的方式。寻址过程:寻址过程:形成指令地址和操作数地址的过程。1. 1. 1. 1. 立即数寻址立即数寻址立即数寻址立即数寻址操作数作为立即数立即数就在指令中给出。例例:MOVAX,1234H操作操作:把立即数1234H送寄存器AX中。机器码:B83412(低字节在地址小的单元)AHALAX.B83412.5678代码段代码段 (存储器中存储器中)操作码操作码(B8)操作数操作数(1234H)立即数立即数一一条条指指令令指令执行后,AX=1234H(原有的内容被新的内容替换)。1234MOVAX,1234

9、H2. 2. 2. 2. 寄存器寻址寄存器寻址寄存器寻址寄存器寻址操作数在某个寄存器寄存器中。例例:INCBL操作操作:使BL中内容加1后送回+1BL00即BL=00H,则执行后BL=01H若BL=FFH,则执行后BL=00H01关于存储器寻址的说明*操作数在存储器存储器中的一个或几个单元单元中。*在以下几种寻址方式中,要找到操作数,关键是必须找到该操作数所在单元的地址地址。*由于8086对存储器采用分段的组织结构,内存单元的地址由段段起起始始地地址址(基基地地址址)和该单元与段起始地址之间的距距离离(即偏移量,以字节数字节数计)两部分共同决定。段起始地址段起始地址:某个段寄存器的内容(又称段

10、基值段基值)乘以16得到。段内偏移量段内偏移量 (亦称为:有效地址EA):该单元与段起始地址之间的距离距离(字节数字节数)。有效地址有效地址EA待寻址的内存单元待寻址的内存单元(CS,DS,ES,SS)16段段基基地地址址即:即:物理地址物理地址 =段基值段基值 16+EA内存单元物理地址内存单元物理地址8086规定,在执行某种操作时,采用的段寄存器有一个预先的约定约定。故指令中一般只需给出EA的寻址信息,CPU将能够根据该次操作的性质自动自动选用段段寄存器寄存器,并将其与EA一起形成物理地址物理地址。因此,存储器寻址的实质就是如何形成有效地址有效地址EA。3. 直接寻址直接寻址指令中以偏移量

11、方式直直接接给出操作数的有效地址。即EA=指令中给出的偏移量例例:MOVAX,1234H机器码机器码:A13412操作操作:把偏移量1234H作为EA,在数据数据段段中找到相应的字字单元,再将字单元的内容送AX。本例执行完后,本例执行完后,AX=3050HEA=1234H设DS=3000H31234H1234H+EA=1234H31234H56783050DS16=30000H30000H=3000H16.A13412.5030.指令代码段数据段AHALAXMOV AX, 1234Ha. 直接寻址的操作过程与立即寻址不同。为表示它们的区别,直接寻址的偏移量用一对“ ”表示。立即寻址立即寻址:M

12、OVAX,1234H直接寻址直接寻址:MOVAX,1234Hb.段基值乘以16,相当于段基值(二进制表示)左移4位,或段基值(十六进制表示)在末尾添一个0H。注:注:4.寄存器寄存器 间接寻址间接寻址以间间接接的方式得到有效地址EA,有几个专用的寄存器可用于间接寻址:BX,BP,SI,DI。a. 基址寻址方式基址寻址方式以BX作为基址寻址寄存器,操作数在数据段数据段中。以BP作为基址寻址寄存器,操作数在堆栈段堆栈段中。EA=BX或BP的内容例例:MOVAX,BX机器码机器码:8B04操操作作:以BX的内容作为有效地址EA,在数数据据段段中找到对应的字单元,再将该字单元的内容送AX中。EA=BX

13、设DS=2000H,BX=1000H本例执行后本例执行后 AX=50A0HDS1620000HEA=BX(=1000H)21000H50A08B.04A050代码段数据段AXAHAL这种寻址方式的优点就在于可以随时修改BX寄存器的内容,而指向不同的存储单元。故BX又称为基址指针寄存器。b. 变址寻址方式变址寻址方式以SI,DI寄存器作为间间接接寻寻址址寄存器,操作数在数据段数据段中。EA=SI或DI内容 例例:ADDAX,SIEA=SI操操作作:以EA作为有效地址,在数数据据段段中找到某个操作数,再将该操作数与AX的内容相加,结果存放在AX中。5.5.寄存器相对寻址寄存器相对寻址操作数的有效地

14、址EA由两部分合成,一部分置于某个基址或变址寄存器中,另一部分为指令中指定的8位或16位位移量。操作数所在的默认段与寄存器间接寻址类似。例:MOVAX,4000HDI或MOVAX,DI+4000H设DI=1000H,则有效地址为:EA=1000H+4000H=5000H。若DS=3000H,则物理地址为:30000H+5000H=35000H。6.基址变址寻址基址变址寻址既有基址寄存器(BX或BP),又有变址寄存器参与的(SI或DI)寻址,操作数在基基址址寄存器所规定的段中。EA=(BX或BP)+(SI或DI)例例:MOVAX,BXDI或MOVAX,BX+DI设BX=6000H,DI=1000

15、H,则:EA=6000H+1000H=7000H,默认段为DS。若DS=2000H,则源操作数所对应的物理地址为:20000H+7000H=27000H。7.相对基址变址寻址有效地址由有效地址由三部分三部分组成,组成,即:即:EA=EA=基址寄存器内容基址寄存器内容+ +变址寄存器内容变址寄存器内容+8+8位或位或1616位位移量位位移量。操作数所对应的默认段与基址变址寻址方式相同。操作数所对应的默认段与基址变址寻址方式相同。例:例: MOV AXMOV AX,BX+SI+0080HBX+SI+0080H; 则:则:EA=BX+SI+0080HEA=BX+SI+0080H,操作数在,操作数在数

16、据段数据段例例:MOVAX,0260HBXSIEA=BX+SI+0260H,操作数在数据段数据段中MOVAX,INFBP+DIEA=BP+DI+位移量INF,操作数在堆栈段堆栈段中 *以上两种基址以上两种基址+变址的格式都是合法的。变址的格式都是合法的。课堂练习与思考:课堂练习与思考:1.请指出下列每条指令源操作数的寻址方式。请指出下列每条指令源操作数的寻址方式。(1)MOVAX,BX(2)MOVCH,3AH(3)MOVBX,2000H(4)MOVDX,BX(5)MOVCX,BP+2(6)MOVAX,3BXDI(7)MOVAL,ES:SI(8)MOVBX,DS:BP;寄存器寻址寄存器寻址,操作

17、数在,操作数在BX中中;立即数寻址,操作数为立即数寻址,操作数为3AH;直接寻址,直接寻址,EA=2000H,数在数据段数在数据段;间接寻址,间接寻址,EA=BX,数在数据段数在数据段;寄存器相对寻址,寄存器相对寻址,EA=BP+2,数在堆栈段数在堆栈段;相对基址变址寻址,相对基址变址寻址,EA=BX+DI+3,数在数据段数在数据段;含段超越的变址寻址含段超越的变址寻址,EA=SI,数在附加段数在附加段;含段超越的基址寻址,含段超越的基址寻址,EA=BP,数在数据段数在数据段课堂练习与思考:课堂练习与思考:2. MOV AX,BX+SI+0080H,即:将BX与SI中的内容与0080H相加作有

18、效地址。3.设BX=0123H DI=1000H DS=3200H,默认DS作为操作数对应的段寄存器(假定没使用段前缀),试指出下列指令的寻址方式,并写出其操作数的有效地址和物理地址。(1)MOVAX,1A38H(2)MOVAX,BX(3)MOVAX,BX+1A38H(4)MOVAX,BX+DI(5)MOVAX,BX+DI+1A38H课堂练习与思考:课堂练习与思考:解:解:解:解:(1)直接寻址)直接寻址 有效地址有效地址=1A38H, 物理地址物理地址=32000H+1A38H=33A38H(2)寄存器间接寻址寄存器间接寻址 有效地址有效地址=0123H, 物理地址物理地址=32000H+0

19、123H=32123H(3)寄存器相对寻址寄存器相对寻址 有效地址有效地址=0123H+1A38H=1B5BH, 物理地址物理地址=32000H+1B5B=33B5BH(4) 基址变址寻址基址变址寻址 有效地址有效地址=0123H+1000H=1123H, 物理地址物理地址=32000H+1123H=33123H(5)相对基址变址寻址相对基址变址寻址 有效地址有效地址=0123H+1000H+1A38H=2B5BH, 物理地址物理地址=32000H+2B5BH=34B5BH 4.2 8086指令系统指令系统8086指令按功能分为六大类。指令按功能分为六大类。8086指令系统数据传送指令算术运算

20、指令逻辑运算指令串操作指令程序控制指令CPU控制指令memmem 存储器操作数存储器操作数存储器操作数存储器操作数 datadata 立即数立即数立即数立即数 opropr 表示操作数表示操作数表示操作数表示操作数 存储单元的内容存储单元的内容存储单元的内容存储单元的内容accacc 累加器操作数累加器操作数累加器操作数累加器操作数(AX(AX或或或或AL) AL) regreg 寄存器寄存器寄存器寄存器srcsrc 源操作数源操作数源操作数源操作数 segregsegreg 段寄存器段寄存器段寄存器段寄存器distdist 目的操作数目的操作数目的操作数目的操作数 S_insS_ins 串操

21、作指令串操作指令串操作指令串操作指令dispdisp 8 8位或位或位或位或1616位位移量位位移量位位移量位位移量countcount 移位次数,可以是移位次数,可以是移位次数,可以是移位次数,可以是1 1或或或或CLCLportport 输入输出端口,可用数字或表达式表示输入输出端口,可用数字或表达式表示输入输出端口,可用数字或表达式表示输入输出端口,可用数字或表达式表示本节中要用到的一些符号所表示的含义:本节中要用到的一些符号所表示的含义:本节中要用到的一些符号所表示的含义:本节中要用到的一些符号所表示的含义:4.2.1 数据传送类指令数据传送类指令数据传送指令能够完成下列操作数的传送传

22、送任务。立即数存储器段寄存器CS,DS,ES,SS通用寄存器组AX,BX,CX,DXBP,SP,SI,DI(CS不能作目的不能作目的寄存器寄存器)1. 1. 1. 1. 通用数据传送指令通用数据传送指令通用数据传送指令通用数据传送指令 MOVMOVMOVMOV指令形式:MOV dist, src功功能能:将源操作数s复制到目标操作数d,源保持不变,目标被源代替。注注:d,s不能同时为存储器错误指令:MOVBX,SId不能为立即数错误指令:MOV1234H,AXd,s必须同时为字节型或字型错误指令:MOVAX,BL指令后的分号“;”以后为注释部分,对指令的执行没有任何影响,主要是便于阅读或解释指

23、令的功能。例例:MOVAX,0;AX0,AX清0;执行后,AX=0MOVSI,BP;SIBP,BP内容送SI;执行后,SI=BP,BP不变不变MOVAL,BUFFERS;BUFFERS内存单元内容送入AL这这里里,BUFFERS代表符符号号地地址址,从该地址单元中取出内容送AL寄存器。相当于直接寻址方式。相当于直接寻址方式。EA=BUFFERS偏移量偏移量3030HBUFFERSALMOV AX,DATA SI+BXEA=SI+BX+DATA,在数据段中寻找字单元,取出该字单元的内容送入AX。设DS=3000H,SI=200H,BX=1000H,DATA的偏移量为100H,则:EA=SI+BX

24、+DATA=200H+1000H+100H=1300H物理地址=DS16+EA=30000H+1300H=31300H即从31300H和31301H两单元中取出内容送AX。DS1630000H123434H12HAXAH ALEA=1300HDATASIBXDATA31300H31301HMOVAX,DATASI+BX2.交换指令:XCHGreg,mem/reg;交换源和目标操作数注注:d=通用寄存器s=通用寄存器或存储器例:XCHGAX,SI+400H执行后,5678H被送到内存单元AX=1234H3412SI+400H5678AH ALAX341278563. 堆栈操作堆栈操作指令:指令:

25、PUSH、POPPUSHmem/reg/segreg;SP2 SP; 源操作数压入堆栈保存源操作数压入堆栈保存POPmem/reg/segreg; SP所指堆栈的内容送目的地;所指堆栈的内容送目的地;SP+2 SP8086系统中的堆栈系统中的堆栈按“后后进进先先出出”原则,用作数据暂时存储的一组寄存器寄存器或存储单元存储单元称为堆栈。堆栈操作有两种:压压入入(PUSH)和和弹弹出出(POP),而SP始终指向堆栈栈顶的新位置。1. 1. 堆栈的定义堆栈的定义堆栈的定义堆栈的定义堆栈中数据按“后后进进先先出出”的结构方式进行处理,即新入栈的依次堆放在原来数据之上,存放信息的最后一个单元叫做栈栈顶顶

26、,用堆栈指针SP(StackPointer)指示。2. 2. 构成堆栈的两种形式构成堆栈的两种形式 一一种是使用种是使用CPU内部的内部的一组寄存器一组寄存器作为堆栈。作为堆栈。 优点优点:访问速度快。:访问速度快。 缺点:缺点:寄存器数量有限。寄存器数量有限。 另另一一种种形形式式是是在在随随机机存存储储器器RAM中中开开辟辟一一个个区区间供堆栈使用,较为普遍;间供堆栈使用,较为普遍;3. 3. 堆栈编址结构的两种形式堆栈编址结构的两种形式堆栈编址结构的两种形式堆栈编址结构的两种形式(1) 向上生成向上生成该结构中,每压压入入一个数据,堆栈指示器SP按增增量量修改;每弹弹出出一个数据,SP按

27、减量减量修改。(2) 向下生成向下生成该结构中,每压压入入一个数据,SP按减减量量修改;每弹出弹出一个数据,SP按增量增量修改。堆栈操作示意图(向下生成)M3M2M1MXSP(a)M3M2M1MXSP(b)AM3M2M1MXSP(c)AB当前栈顶地址为当前栈顶地址为M,存内容存内容X信息信息B进栈:进栈:SPSP1,SP指定的地址指定的地址B信息信息A进栈分两步操进栈分两步操作作: SPSP1,SP指定的地址单元指定的地址单元A堆栈操作示意图(向下生成)MM3M2M1XSP(d)ABCM3M2M1MXSP(f)ABCM3M2M1MXSP(e)ACBSPSPCSPB信息信息C进栈进栈信息信息C出

28、栈分两步操作:指定出栈分两步操作:指定的目的地的目的地C,SPSP+1信息信息B出栈:指定目的地出栈:指定目的地B,SPSP+1堆栈操作示意图(向下生成)MM3M2M1XSP(g)ADCM3M2M1MXSP(i)ADCM3M2M1MXSP(h)ACDSPDSPA信息信息D进栈:进栈: SPSP1,SP指定的地址指定的地址D信息信息D出栈出栈信息信息A出栈,栈顶地出栈,栈顶地址仍为址仍为M 由由上上图图中中可可以以看看出出,出出栈栈操操作作并并不不会会从从堆堆栈栈中中去去掉掉信信息息,也也不不擦擦除除它它们们,只只是是因因SP的自动修改而改变了堆栈的栈顶。的自动修改而改变了堆栈的栈顶。 堆堆栈栈

29、主主要要用用于于中中断断控控制制,子子程程序序调调用用以以及数据暂时存储。及数据暂时存储。例:PUSHBX;把BX内容压入堆栈设SS=2000H,SP=0040H,BX=2340H则执行后,2340H被保存到堆栈,同时SP=003EH,BX内容不变SS1620000HSP=0040HSP=0040H( (初值初值初值初值) )20040H2003EH4023SP=003EH(压栈后压栈后)XX23 40BX注注:s和d只能为16位寄存器或存储单元错误指令:PUSH1234HPOPALPOPCS(1)标志入栈指令:PUSHF功功能能:把16位的标志寄存器压入堆堆栈栈保存,且:SP2SP。4. 4

30、. 标志寄存器传送指令标志寄存器传送指令(2)标志出栈指令:POPF 功能功能:将当前当前SP所指内容(2字节)弹出至标志寄存器标志寄存器,且:SP+2SP。(3)读取标志寄存器指令:LAHF功能功能:将标志寄存器低低8位位装入AH寄存器SF ZFAFPFCFFR70AH(4)设置标志指令:SAHF功功能能:把AH的内容送入标志寄存器的低低8位位。5. 5. 地址传送指令地址传送指令在程序设计中,对于任一个存储器操作数,都是由逻辑地址(包括:段地址和偏移地址)确定了它们在存储器中的位置。目标地址传送指令用于获得存储器操作数的段地址或偏移地址。(1)取有效地址指令: LEA reg, mem功能

31、功能:取存储器源操作数有效地址有效地址送入目标dd=通用寄存器例:LEABX,COUNTER;取COUNTER地址偏移量BX若COUNTER地址偏移量为0002H,则执行后BX=0002H(2)地址指针装到指定的寄存器和DS的指令: LDS reg, mem功能功能:装入地址指针地址指针,段地址DS,偏移地址d这条指令往往改变了段段寄寄存存器器DSDS的内容,使得DS指向了另外另外一个数据段。例例:LDSSI,BASE设执行前,DS=1000H,SI=0000H,BASE偏移地址为0004H,10004H10007H单元内容依次为00H,30H,00H,20H;则执行后:DS=2000H,SI

32、=3000H003000200004HSI=3000H原DS所指向的数据段新DS所指向的数据段1000H1610000HDSBASE30002000SIDS2000H1620000HDS(3)地址指针装到指定的寄存器和ES的指令:LES reg, mem功能功能:装入地址指针地址指针,段地址 ES,偏移地址d即:BX寄存器含有表格的起始地址,AL中的值是作进入表格中的偏移量,查出表格中的内容送入AL中。例例例例设设DS=3000HDS=3000H, AL=09HAL=09H, BX=0080HBX=0080H执行指令执行指令XLATXLAT作用是:作用是:将存储器将存储器30089H30089

33、H单元中的单元中的内容内容送入送入ALAL中。中。(1)换码指令换码指令XLAT(查表转换)(查表转换) 功能:功能: (BX+AL)AL6.累加器专用传送指令累加器专用传送指令例例:设表首的偏移地址为2000H,要查找表内第4号单元(从0号算起)的内容并送回AL,则程序段如下:MOVBX,2000HMOVAL,04HXLAT则执行后,AL=09H 18H34H05H06H09H2000HBX04HAL(表首)TABLEDS1604AL09MOVBX,2000HMOVAL,04HXLAT(2)输入)输入/输出(输出(I/O)指令)指令功能:从指定端口输入数据至累加器acc(AL或AX),por

34、t=0255 IN acc, portAH ALacc端口port16位数据时 IN acc, DX功能功能:从DX指示的端口输入数据至累加器 OUT port, acc功能功能:将累加器的数据输出至指定端口。 OUT DX,acc功能功能:将累加器的数据输出到DXDX所指示的端口。注注: 1616位位端口地址必须送入DXDX中。 若采用AXAX,则表示1616位位数据传送(输入/输出)4.2.2 4.2.2 算术运算类指令算术运算类指令算术运算类指令算术运算类指令算算术术运运算算指指令令的的操操作作数数可可以以是是无无符符号号数数,也可以是也可以是有符号数有符号数。算算术术运运算算指指令令一

35、一般般影影响响标标志志位位,而而数数据据传传送指令一般不影响标志位。送指令一般不影响标志位。1. 1. 1. 1. 加法指令加法指令加法指令加法指令(1)ADDd,s功功能能:将s与d相加,结果在d中。根据操作结果设置标志位标志位。例例:ADD BX+106BH,1234H设DS=2000H,BX=1200H,则:EA=1200H+106BH=226BH物理地址物理地址:2000H16+226BH=2226BH又设原来(2226BH)=90H,(2226CH)=30H则指令执行后执行后有:3090H+1234H=42C4H,即:(2226BH)=C4H,(2226CH)=42H标志位标志位:C

36、F=0,ZF=0,SF=0, AF=0,PF=0注:42C4H=0100,0010,1100,0100B(2)ADCd,s功功能能:将s与d再与进位CF相加,结果留在d中,ADC指令主要用于多字节相加。例例:MOVAX,0FH;AX=000FHADDAL,0F1H;AL+F1HALADCAH,0;AH+0+CFAH最后结果:AH=01H,AL=00H注注:若若是是立立即即数数,且且最最高高位位为为数数码码AF,则则必必须须在在前前面添加一个面添加一个0,以避免混淆。,以避免混淆。(3)INCd功能功能:将d加1后送回d。注注:INC指令不影响不影响进位标志CF。该指令经常用于修改地址指针寄存器

37、(BX,BP,SI,DI),使之指向下一个单元。2. 2. 2. 2. 减法指令减法指令减法指令减法指令(1)SUBd,s功能功能:d-sd,同时影响影响标志位。(2)SBBd,s功能功能:d-s-CFd,同时影响影响标志位。(3)DECd功能功能:d-1d该指令与INC相反操作,也不不影影响响进位标志CF。(4)求补指令:求补指令:NEG d功能功能:对d进行求补运算后送回(按位求反再加1)。例例:MOVAL,7FHNEGAL;将AL中的各位求反后再在最低位加1,即:AL+1AL;亦即:0-ALAL计算结果:AL=AL+1=7FH+1=80H+1=81H或者:AL=0-AL=0-7FH=81

38、H(5)比较指令CMPd,s功功能能:作一次减法运算d-s,但不回送结果,只根据结果设置设置标志位。比较指令往往用于判断两数是否相等,或两数大小关系。若相等,则零标志ZF=1。3. 3. 3. 3. 乘法指令乘法指令乘法指令乘法指令乘法指令在指令中只出现一个操作数s (乘乘数数),另一个操作数固定在累累加加器器(AX或AL)中。(1)MULs功能功能:无符号数乘法指令a.8位乘法被乘数=AL,乘数=s积(16位)=AH:AL中,即在AX中AH为高8位,AL为低8位。AL(8位)s(8位) AHAL(16位)标志的影响标志的影响:当乘积的高半部分(字节相乘时为AH,字相乘时为DX)不为零,则CF

39、=1,OF=1;否则CF=OF=0。b.16位乘法被乘数=AX,乘数=s积(32位)=DX:AXDX为高16位,AX为低16位。AX(16位)s(16位) DXAX(32位)例例:MULBX若执行前AX=0012H,BX=0066H则执行后DX=0000H,AX=072CH(2)IMULs功能功能:有符号数乘法指令8086规规定定,有有符符号号数数一一般般采采用用补补码码表表示示。故故有有符符号号数数作作乘乘法法运运算算时时,必必须须先先把把它它们们转转变变为为原原码码数数相相乘乘,积积也也为为原原码码数数,再再将将原原码码数转变为补码数。这个工作由数转变为补码数。这个工作由CPU自动完成。自

40、动完成。例例:MOVAL,88H;88H为120的补码MOVBL,2IMULBL结果:AX=FF10H;FF10H为240的补码若直接用MULBL指令,则AX=0110H4. 4. 4. 4. 除法指令除法指令除法指令除法指令(1)DIVs功能功能:无符号数相除a.字节除被除数=AX,除数=s(s0)结果:商=AL,余数=AHALAHAL(8位)(16位).AH(8位)s(8位)商余数b.字除被除数=DX:AX,除数=s(s0)结果:商=AX,余数=DXAXDXAX(16位)(32位).DX(16位)s(16位)商余数(2)IDIVs功能功能:带符号数除法采用的固定寄存器与DIV相同。(3)字

41、节扩展为字指令 :CBWCBW:字节除法的符号扩展指令功能功能:若AL为正数正数(D7=0)则AH=00HAL为负数负数(D7=1)则AH=FFHCWD:字除法的符号扩展指令功能功能:若AX为正数正数(D15=0)则DX=0000HAX为负数负数(D15=1)则DX=FFFFHCBW和CWD一般用于带符号数除法指令之前,使被除数的长度增为原来的两倍。两指令都不影响标志位。(4)字扩展为双字指令CWD 若2800H=9CH(表示-100),2801H=09H(表示+9),则执行程序后,AL=0F5H(表示-11),AH=0FFH(表示-1),余数的符号与被除数相同。例例:设被除数存放在内存280

42、0H单元,除数存放在内存2801H单元,它们均是有符号数,编程作除法,将商存在2802H单元,余数放2803H单元。MOVDI,2800H;DI作地址指针MOVAL,DI ;取被除数(8位)CBW ;符号扩展到AH中MOVBL,DI+1;取除数IDIVBL;带符号数除法:AXBLAL,余数AHMOVDI+2,AL;保存商MOVDI+3,AH;保存余数若2800H=64H(表示+100),2801H=0F7H(表示-9),则执行程序后,AL=0F5H(表示-11),AH=01H(表示+1),余数为正数。5. 5. 5. 5. 十进制调整指令十进制调整指令十进制调整指令十进制调整指令运运算算器器按

43、按二二进进制制规规律律进进行行运运算算,如如果果参参与与运算的是运算的是BCDBCD码数,则需要对结果进行调整。码数,则需要对结果进行调整。100010010000100100001000组合组合的BCD码数,例:未组合未组合的BCD码数,例:899(低位)8(高位)代表89 AAAAAA:加法的非压缩型加法的非压缩型BCDBCD码调整指令码调整指令功能功能:对未组合型未组合型BCD码加法码加法的结果进行校正(调整)。校正校正(调整调整)方法:方法:若AL中低4位数值9或AF=1,则:a.AL+6AL,且AL高4位清0b.AH+1AH否则不作调整。(1)加法的)加法的BCD码调整码调整例例:M

44、OVAH,0MOVAL,00000110B;代表6ADDAL,00000111B;代表7AAA000001106+000001117调整调整+00000110000011010001001100000011AL清000000000+1=00000001AH最后结果AH = 01H,AL = 03HDAA:压缩型BCD码加法调整指令 功功能能:对组组合合型型BCD码码加加法法的结果进行校正(调整)。DAA同时对AL中低低4位位和高高4位位进行调整。例例. 组合BCD码调整MOVAL,00100111B;代表27ADDAL,10000110B;代表86DAA+1000011000100111调整调

45、整+0110011010101101100010011进位1调整后结果:调整后结果:CF=1,AL=00010011(代表13)进位位与AL合成结果:113 MOVAL,00100111BADDAL,10000110BDAA(2)减法的BCD码调整 AAS:非压缩型:非压缩型BCD码减法的调整指令码减法的调整指令 指令功能:指令功能:把把ALAL的减法结果调整为非压缩型的减法结果调整为非压缩型BCDBCD码数。码数。调整后的结果低位在调整后的结果低位在ALAL中,高位在中,高位在AHAH中。中。调整的原则是:若调整的原则是:若AF=1AF=1,则执行操作:,则执行操作:AL-6AL,且将,且将

46、AL的高的高4位清位清0;AH-1AH;1CF。否则,不做调整。否则,不做调整。DAS:压缩型BCD码减法的调整指令指令功能:把指令功能:把ALAL中的减法结果调整为中的减法结果调整为缩压型缩压型BCDBCD码数,调整后的结果在码数,调整后的结果在ALAL中。中。调整原则如下:若调整原则如下:若ALAL中低中低4 4位大于位大于9 9或或AF=1AF=1,则,则AL-06HALAL-06HAL,并使,并使AFAF置置1 1;若若ALAL中高中高4 4位大于位大于9 9或或CF=1CF=1,则,则AL-60HALAL-60HAL,并,并使使CFCF置置1 1。最后结果最后结果 AL = 0011

47、0110B(代表代表36),CF=0例例: MOVAL,01110011B(代表73)MOVBL,00110111B(代表37)SUBAL,BL01110011001101110011110000110110DAS相减调整调整00000110(3)乘法的BCD码调整AAMAAM:乘法的:乘法的非压缩型非压缩型BCDBCD码调整码调整 指令功能:把指令功能:把AXAX的乘法结果调整为非压缩型的乘法结果调整为非压缩型BCDBCD码数。调整后的结果低位(码数。调整后的结果低位(个位个位)在)在ALAL中,中,高位(高位(十位十位)在)在AHAH中。中。调整过程:调整过程:把把ALAL的内容除以的内容

48、除以0AH0AH,商放,商放AHAH中,中,余数放余数放ALAL中。中。例:例:MOVAL,00001000B(代表8)MOVBL,00001001B(代表9)MULBLAAM0000100000001001AL=01001000AH=00000000最后结果AH=00000111B(代表7)对上述结果进行调整:AL/00001010BAH(商)AL%00001010BAL(余数)AL=00000010B(代表2)AH,AL中表示未组合型中表示未组合型BCD码码72。 AAM的操作实质是:的操作实质是: 将将AL中不大于中不大于99的二进制数转换成非压缩型的二进制数转换成非压缩型BCD码码 (

49、4)除法的除法的BCD码调整码调整AAD:除法的非压缩型非压缩型BCD码调整指令功能:对AX中的两位非压缩型BCD码数进行调整。调整原则:AH0AH+ALAL,0AH;显然AAD的操作实质是将将AX中的非压缩型中的非压缩型BCD码(十进制数)转换为二进制码(十进制数)转换为二进制。与其它5条调整指令不同的是,AAD指令须放在相应的除法指令之前之前。例例:MOVAX,0000011100000010B(代表72)AAD 调整前调整前:AH=00000111;AL=00000010 调整后调整后:AH=00000000;AL=00000111B00001010B+00000010B=0100100

50、0B710272=48HAADAAD指令相当于:指令相当于:将两个未组合型将两个未组合型BCD码数转换为一个二进制数。码数转换为一个二进制数。4.2.3 4.2.3 逻辑运算和移位类指令逻辑运算和移位类指令逻辑运算和移位类指令逻辑运算和移位类指令逻辑指令在底层软件中提供了对二进制位的控制。可以对位进行置置位位、清清0或取取反反。常用于控制系统的I/O设备。1. 1. 1. 1. 逻辑运算类指令逻辑运算类指令逻辑运算类指令逻辑运算类指令(1)ANDd,s功能功能:s和d的内容按位按位相“与与”,结果在d中。AND指令通常用于使某些位清0,而另一些位保持不变。例例:ANDBX,0F0FH若BX=5

51、555H,则执行后BX=0505H0101,0101,0101,0101B0000,1111,0000,1111B0000,0101,0000,0101BAND(2)ORd,s功能功能:s和d按位按位相“或或”,结果送d。OR操作经常用于将某些位置位,其它位不变。0101,0101,0101,0101B0000,1111,0000,1111B0101,1111,0101,1111BOR(3)XORd,s功能功能:s和d按位按位相“异或异或”,结果送d。XOR操作经常用于将某些位取反,其它位不变。0101,0101,0101,0101B0000,1111,0000,1111B0101,1010,

52、0101,1010BXOR例:例:(4)NOTd功能功能:将d按位求反按位求反后送回。即:dd(5)测试指令 TESTd,s功能功能:s和d按位按位相“与与”,但但不送结果不送结果,只根据结果设置设置标志位。TEST指令通常用于测试某些位是为0还是为1例:例:TEST AL,09H;AL09H,即测试AL的D3、D0位;若此两位均为两位均为0,则,则ZF=1, ;否则;否则ZF=02. 2. 2. 2. 移位指令移位指令移位指令移位指令(1) 算术移位算术移位a.算术左移CF0101101010CF011010101左移1次:SALd,1左移多次:SALd,CL;CL中的值为中的值为移位次数移

53、位次数例例:MOVBL,10001001BSALBL,1结果:CF=1,BL=00010010B0CF注注:移位多次时,移位次数必须:移位多次时,移位次数必须预先预先置入置入CL中。中。右移1次:SARd,1右移多次:SARd,CLb. 算术右移算术右移CF符号位(2) 逻辑移位逻辑移位a.逻辑左移SHL与SAL完全相同。b.逻辑右移SHRd,1 SHRd,CLCF0(3) 循环左循环左移移a.不带进位循环左移不带进位循环左移b.ROLd,1ROLd,CLCFb. 带进位循环左移带进位循环左移RCLd,1RCLd,CLCF(4) 循环右循环右移移a.不带进位循环右移RORd,1RORd,CLC

54、Fb.带进位循环右移带进位循环右移RCRd,1RCRd,CLCF例例:设32位数在DX:AX中,实现32位数整个左移1次。SAL AX,1RCL DX,10CFAXSALDXRCL4.2.4 4.2.4 串操作指令串操作指令串操作指令串操作指令(1 1 1 1) 串的概念串的概念串的概念串的概念串是连续存放在内存中的字节块或字块。每个串有一个起始地址和长度。(2 2 2 2) 方向标志方向标志方向标志方向标志方 向 标 志DF选择串操作期间寄存器DI, SI 的 自 增(DF=0)或 自 减(DF=1)操作。起始地址A00HHGFEDCB串长=8字节块(串)(3 3 3 3) 串所在的段串所在

55、的段串所在的段串所在的段规定:规定:(1) (1) 源串在数据段,用源串在数据段,用SISI作地址指针作地址指针(2) (2) 目的串在附加段,用目的串在附加段,用DIDI作作地址指针地址指针如果源串与目的串实质上在一个段中,则要令ES=DS。表4.1串操作指令的隐含参数隐含参数隐含参数对应的单元或寄存器对应的单元或寄存器源串的起始地址DSSI目标串的起始地址ESDI重复次数CXLODS指令的目的操作数AL/AXSTOS指令的源操作数AL/AXSCAS指令的扫描值AL/AX地址修改方向DF=0,SI、DI自动增量修改DF=1,SI、DI自动减量修改1.1.1.1.串传送指令串传送指令串传送指令

56、串传送指令MOVSd,s或写成MOVSB(字节串传送)MOVSW(字串传送)功能功能:源串DS:SI目的串ES:DI同时自动修改SI,DI2. 读串读串 LODS sLODSB(字节串)LODSW(字串)功能功能:DS:SI AL或AX同时自动修改SI3. 存储串存储串 STOS dSTOSB(字节串)STOSW(字串)功能功能:AL或AXES:DI同时自动修改DI4. 串比较串比较 CMPS d, sCMPSB(字节串比较)CMPSW(字串比较)功能功能:作一次减法减法:DS:SI-ES:DI但不送结果不送结果,同时自动修改SI,DI串比较指令常常与有条件重复前缀重复前缀配合。5. 串扫描(

57、搜索)串扫描(搜索) SCAS dSCASB(字节串搜索)SCASW(字串搜索)功能功能:做一次减法减法AL-ES:DI(字节)AX-ES:DI(字)同时自动修改DI,但不回送结果,只根据结果置有关标志位串搜索指令也常与有条件重复前缀重复前缀相配合。重复前缀(REP)可以加到串数据传送指令上。REP前缀使得每次执行串指令后CX减1。CX减1以后,重复执行串指令,直到CX值为0时,指令才终止。6. 重复前缀重复前缀(1)REP S_ins;CX-1CX,若CX0,重复执行串操作。常用作常用作MOVS,STOS指令的前缀指令的前缀(2)REPE/REPZ S_ins;CX-1CX,若CX0;且ZF

58、=1重复,否则不重复常用作常用作CMPS、SCAS指令的前缀指令的前缀 (3)REPNE/REPNZ S_ins;CX-1CX, CX0 ;且ZF=0时重复,;否则不重复。 常用作常用作CMPS,SCAS指令的前缀指令的前缀 例1.设源串在1000H:2000H开始的100个字节单元中,要求将源串送到3000H:1020H开始的目的串中。MOVAX,1000HMOVDS,AX;置源数据段寄存器MOVSI,2000H;置源串指针初值MOV AX,3000HMOV ES,AX;置目的附加段寄存器MOV DI,1020H;置目的串指针初值CLD;DF=0,使SI,DI自增MOV CX,64H;置重复

59、次数100DREPMOVSB;重复串传送,直到CX=0初始化例2.比较两个串,发现有不同的字符时则停止比较(即:判断两个字符串是否完全相同即:判断两个字符串是否完全相同)。CLDMOVCX,100MOVSI,2500HMOV DI,1400HREPECMPSB;串比较,直到ZF=0或CX=0才停止。结果结果:若ZF=0,则两个串不相等;若ZF=1,则两个串相等。4.2.5 4.2.5 控制转移类指令控制转移类指令控制转移类指令控制转移类指令 程序控制指令用来控制程序的走向,其实质是设法改变当前的CS和IP值,以使CPU转移到一个新的地址处执行程序。根据CS和IP值的变化情况,转移指令分为段内转

60、移和段间转移。段内转移段内转移(属性NEAR):转移指令和转移目标在转移指令和转移目标在同一代码段同一代码段内,转移时仅需内,转移时仅需要改变要改变IP的值,而的值,而CS的值的值保持不变保持不变。段内转移可实现在一个代码段内的地址空间范围段内转移可实现在一个代码段内的地址空间范围(最大为最大为64KB)内任意转移。)内任意转移。若段内转移的范围在若段内转移的范围在-128+127之间,则称为之间,则称为短转短转移移(属性(属性SHORT)段间转移段间转移(属性FAR):转移指令和转移目标转移指令和转移目标不在同一代码段不在同一代码段内,转移时需内,转移时需 要要同时改变同时改变CS和和IP的

61、值。的值。 段间转移可实现在段间转移可实现在1MB的地址空间范围内任意转移。的地址空间范围内任意转移。无论是段内转移还是段间转移,都还有无论是段内转移还是段间转移,都还有直接直接和和间接间接转移之分。转移之分。直接转移:在转移指令中直接转移:在转移指令中直接指明直接指明目标地址的目标地址的转移转移量量称为直接转移。称为直接转移。间接转移:如果转移地址存放在某一间接转移:如果转移地址存放在某一寄存器寄存器或或内存内存单元单元中,则称为间接转移。中,则称为间接转移。若转移地址存放在寄存器中,则若转移地址存放在寄存器中,则只能实现段内间接只能实现段内间接转移转移(因为寄存器间接寻址的最大范围为(因为

62、寄存器间接寻址的最大范围为64K););若转移地址存放在内存单元中,则若转移地址存放在内存单元中,则既可实现段内间既可实现段内间接转移,也可实现段间间接转移。接转移,也可实现段间间接转移。段内转移还有相对相对和绝对绝对转移之分相对转移:目标地址是相对转移:目标地址是IP值加上一个偏移量值加上一个偏移量的转移称的转移称相对转移。相对转移。绝对转移:以一个绝对转移:以一个新的值完全代替新的值完全代替当前的当前的IP值(值(CS值值可能也发生改变)的转移称为绝对转移。可能也发生改变)的转移称为绝对转移。在在8086指令系统中,指令系统中,段内直接转移都是相对转移,段内直接转移都是相对转移,段内间接转

63、移以及段间转移都是绝对转移段内间接转移以及段间转移都是绝对转移。A:Above 高于,高于, B:Below 低于,低于, C:Carry 进位,进位, E:Equal 等于等于G:Greater 大于,大于, L:Less 小于,小于, N:Not 无,无, O:Over 溢出溢出 ,S:Sign 符号,符号, PE:Parity Even 奇偶性偶,奇偶性偶, PO:Parity Odd 奇偶性奇奇偶性奇 80868086提提供供了了四四种种控控制制转转移移指指令令:无无条条件件转转移移指指令令,条条件件转移指令,转移指令,循环控制循环控制指令和指令和中断中断指令。指令。注意指令中条件缩写

64、字母的含意分别是:注意指令中条件缩写字母的含意分别是:1. 1. 1. 1. 无条件转移指令无条件转移指令无条件转移指令无条件转移指令(1)JMP目标a.段内段内直接直接转移格式JMP目标标号 特点特点:仅仅改变IP值,而CS值不变。例:JMPADDI这里ADDI为转移目标的标号。b.段内段内间接间接转移格式:JMPBX以BX的内容作为转移目标的偏移地址偏移地址。CS值不变,IP值改变。c.段间段间直接直接转移格式:JMPFAR_ADDR功功能能:转移到另一个代码段的目标FAR_ADDR处执行。即以另一个段的基地址CS,标号的偏移地址IP。当前当前CS=2100HJMP0C020065转移目标

65、的偏移地址转移目标的段地址1621000H代码段11665000H新新CS=6500H代码段2转移至此当前当前IP =1500H新新IP = 020CHd.段间段间间接间接转移格式:JMPBX+位移量功能功能:以有效地址有效地址EA = BX +位移量位移量作为开始地址,从前2个单元中取出内容IP,后2个单元中取出内容CS,以转移到新的地址执行程序。例:JMPBX+ADDR3设DS=2000H,BX=1400H,ADDR3=020AH,则执行过程如下:2000H30004000IPCS00300040EA=1400H+020AH执执行行跳跳转转指指令令后后,转转移移至至4000H:3000H处

66、处执执行行程程序序。数据段2. 2. 2. 2. 条件转移指令条件转移指令条件转移指令条件转移指令条件转移指令共有18条,这些指令根据状态标志决定是否转移,转移的目标范围在-128+127之间。A:Above 高于,高于, B:Below 低于,低于, C:Carry 进位,进位, E:Equal 等于等于G:Greater 大于,大于, L:Less 小于,小于, N:Not 无,无, O:Over 溢出溢出 ,S:Sign 符号,符号, PE:Parity Even 奇偶性偶,奇偶性偶, PO:Parity Odd 奇偶性奇奇偶性奇 指令中条件缩写字母的含意分别是:指令中条件缩写字母的含意

67、分别是:条件转移指令的执行流程条件转移指令的执行流程条件满足?顺序执行下一条指令目标处执行NY,转移 (1)无符号数条件转移指令设执行了指令CMPAX,BX,其中AX,BX中均为无符号数(设AX=A,BX=B),则采用以下指令进行转移:含义指令转移条件A高于BA高于等于BA低于等于BA低于BJA / JNBEJAE/ JNBJB / JNAEJBE / JNACF=0ANDZF=0CF=0ORZF=1CF=1ANDZF=0CF=1ORZF=1为判断两个带符号数为判断两个带符号数A,B大小,可先作大小,可先作A-B,若:,若:OF=0且SF=0则必有ABSF=1则必有ABOF=1且SF=0则必有

68、ABSF=1则必有AB得出结论:判断AB的依据依据是OFSF=0AB的依据依据是OFSF=1A=B的依据依据是ZF=1(2) 有符号数条件转移指令有符号数条件转移指令指令格式及功能:指令格式及功能:设执行了指令CMPAX,BX,其中AX,BX中均为有符号数(设AX=A,BX=B),则采用以下指令进行转移:含义指令转移条件ABABABABJG / JNLEJGE / JNLJL / JNGEJLE / JNGSFOF=0ANDZF=0SFOF=0ORZF=1SFOF=1SFOF=1ORZF=1 (3) 单状态标志转移指令单状态标志转移指令含义指令转移条件等于/结果为0JE / JZJNE / J

69、NZJCJNCZF=0ZF=1CF=0CF=1不等于/结果不为0有进位/有借位无进位/无借位溢出不溢出有偶数个“1”有奇数个“1”符号位为1符号位为0JOJNOJP / JPEJNP / JPOJSJNSOF=0OF=1PF=0PF=1SF=0SF=13.子程序调用和返回指令子程序调用(CALL)指令包括:段内直接调用、段内间接调用、段间直接调用、段间间接调用等形式形式。在CALL指令中直接给出子程序名直接给出子程序名是最常见的形式。返回指令包括RET和RET n两种形式,其中的RET n是带弹出值返回指令带弹出值返回指令 。(1) CALL 目标目标 (过程名过程名)CALL指令完成指令完成

70、调用子程序调用子程序的功能。的功能。CALL指令完成的操作: 将将程程序序的的返返回回地地址址(CALL(CALL的的下下一一条条指指令令地地址址) )压压入入堆堆栈栈中保存中保存。将将目目标标的的偏偏移移地地址址IP。若若为为远远调调用用则则再再将将目目标标的的段地址段地址CS。转移转移至新的至新的目标目标 (子程序子程序)地址地址执行执行如果是近调用,则堆栈中只保存返回地址的偏移地址偏移地址;若是远调用,则还必须保存返回地址的段地址段地址。注注意意:在在子子程程序序中中 ( (过过程程) ),最最后后执执行行的的一一条条指指令令必必须须是是返返回回指指令令RETRET,它它将将堆堆栈栈中中

71、保保存存的的返返回回地地址自动弹出至址自动弹出至CSCS和和IPIP,从而,从而准确地准确地返回到主程序。返回到主程序。CALL指令段内调用段间调用直接调用间接调用直接调用间接调用(近调用)(远调用)(2)RET指令指令指令格式:RET指令功能:执行与CALL指令相反相反的操作,从子程序返回返回到主程序。具体操作如下:段内返回:栈顶字IP,SP+2SP段间返回:栈顶字IP,SP+2SP;栈顶字CS,SP+2SPRET指令常放在子程序的最后最后。类似地,RET指令是段内返回还是段间返回,取决于RET指令与CALL指令是否在同一个段内。(3)RETn返回指令。返回指令。它与它与RETRET的的区别

72、区别是:是:使使SPSP值在正常返回之后的基础上值在正常返回之后的基础上再加上再加上n n (n(n为弹出值为弹出值,是一个小于是一个小于256256的偶数的偶数) )。加加上上n n的的目目的的是是为为了了丢丢弃弃原原已已压压栈栈的的n n个参数。个参数。4. 4. 循环控制指令循环控制指令共有四条四条循环控制指令;均是以CX寄存器作为计数指针,每循环一次,CX减1;当CX减至减至0时,停止循环。(1) LOOP 目标标号目标标号功能功能:CX-1CX,若CX0则转移至目标地址;否则顺序执行下一条指令。注:循环前注:循环前CX必须赋初值必须赋初值(循环次数循环次数)(2) LOOPE/LOO

73、PZ 目标标号目标标号功能功能:CX-1CX,若CX0且且ZF=1则转移至目标地址;否则(CX=0或ZF=0)停止循环。(3) LOOPNE/LOOPNZ 目标标号目标标号功能功能:CX-1CX,若CX0且ZF=0则转移至目标;否则停止循环(CX=0或ZF=1)。(4) JCXZ 目标标号目标标号功能功能:若CX=0则转移至目标地址,否则顺序执行下一条指令。5.5.中断指令中断指令(1) 中断入口地址表中断入口地址表8086系统允许有256种中断类型(0255);每个中断在中断入口地址表中占4个字节;前2个字节用于存放中断入口地址的偏移地址;后2个字节用来存放中断入口地址的段基址。偏移地址0段

74、基址0偏移地址1段基址100000H00004H00008H003FCH003FFH0#1#2#255#偏移地址255段基址255(2) 中断的响应过程中断的响应过程a.标志寄存器FR压栈压栈;b.使IF=0,TF=0;c.将当前程序断断点点的基址和偏移地址入栈保护(以便能够正确返回);d.将中中断断类类型型号号4,得到中断入口地址在中断入口地址表的位置,从该位置起连续的4个单元个单元中获得中断入口地址置入CS,IP;e.CPU转向中断服务程序中断服务程序执行相关程序。(3) 中断指令中断指令a.INTn功能功能:执行软件中断,中断类型号为n,n=0255。b.INTO功能功能:等价于INT4

75、,当运算结果产生溢出(OF=1)时,产生溢出中断。c. IRET 功能功能:中断返回。执行的操作: 从堆栈中弹出断点地址送从堆栈中弹出断点地址送CS和和IP; 恢复标志寄存器的内容;恢复标志寄存器的内容; CPU回到被打断的地址处继续执行主程序。回到被打断的地址处继续执行主程序。4.2.6 4.2.6 处理器控制指令处理器控制指令处理器控制指令处理器控制指令1. 1. 1. 1. 标志位操作指令标志位操作指令标志位操作指令标志位操作指令(2)CLD;使DF=0(用于串操作之中)STD;使DF=1(3)CLI;使IF=0(禁止可屏蔽中断)STI;使IF=1(允许可屏蔽中断)(1)CLC;使CF=

76、0(2)STC;使CF=1(3)CMC;使CF=CF(取反)2. 外同步指令外同步指令(1) ESC外部操作码,源操作外部操作码,源操作数数交交权权指指令令,可可以以要要求求另另外外的的处处理理器器(如如:8087)执行某种操作。)执行某种操作。每每隔隔5个个时时钟钟周周期期,测测试试一一次次TEST引引脚脚,当当测测试试到到该该引引脚脚上上的的信信号号变变为为低低电电平平(有有效效)时时,便便退退出出等等待待状状态态。与与ESC指指令令联联合合使使用用,提提供供了了一一种种存存取取8087数据的能力。数据的能力。(2) WAIT 等待指令,使处理器处于空转等待状态等待指令,使处理器处于空转等

77、待状态 (3) LOCK锁定命令,锁定总锁定命令,锁定总线线前前缀缀指指令令,可可放放在在任任何何一一条条指指令令前前面面。这这条条带带LOCK前前缀缀的的指指令令的的执执行行,可可使使8086的的LOCK引引脚脚低低电平电平有效,从而使得该指令在执行期间有效,从而使得该指令在执行期间封锁外部总线封锁外部总线。 (1) 空操作指令空操作指令 NOPCPU执行此指令时,不做任何具体的操作,但它消耗3个个时时钟钟周周期期的时间,它常用于程序运行中的短延时需求等。3.其他处理器控制指令(2)暂停指令)暂停指令 HLT 处理器暂停命令,有三三种种状态可以使处理器脱离暂停:a. RESET 信号有效信号

78、有效b. NMI 有效有效c. INTR 有效有效 (且且IF = 1)4.3 4.3 汇编语言程序设计汇编语言程序设计4.3.1 4.3.1 汇编语言的基本概念汇编语言的基本概念汇编语言的基本概念汇编语言的基本概念1 机器语言与汇编语言机器语言与汇编语言(Machine Language and Assembly Language) 由二进制代码由二进制代码0 0,1 1表示的指令称为表示的指令称为机器机器指令指令,相应的程序称为机器语言程序,相应的程序称为机器语言程序 。 用用指指令令助助记记符符表表示示的的指指令令称称为为汇汇编编语语言言指令指令,对应对应的程序称的程序称为汇编语为汇编语

79、言程序。言程序。 例例 : 将将1位十六进制数位十六进制数转换为转换为ASCII码字符。码字符。已知当数在已知当数在0000B-1001B时,对应的时,对应的ASCII码为码为09;当数在;当数在1010B1111B时,对应的时,对应的ASCII码为码为AF。 设待转换的数据设待转换的数据已在已在累加器累加器AL中(低中(低4位)。位)。 编制的机器语言程序与汇编语言编制的机器语言程序与汇编语言程序如下表所示。程序如下表所示。地地 址址机器代机器代码码对应对应的的汇编汇编指令指令E380:000024 0FAND AL,0FHE380:00023C 0ACMP AL,0AHE380:00047

80、2 02JB NUME380:000604 07ADD AL,07HE380:000804 30NUM:ADD AL,30HE380:000AC3RET2 2汇编语言与高级语言汇编语言与高级语言(Assembly Language (Assembly Language and Computer-independent Language)and Computer-independent Language) 汇编语言汇编语言是一种依赖于计算机微处理器的语言是一种依赖于计算机微处理器的语言 汇编语言汇编语言一般不具有通用性和可移植性一般不具有通用性和可移植性 进行进行汇编语言汇编语言程序设计必须熟悉

81、机器的硬件资程序设计必须熟悉机器的硬件资 源和软件资源源和软件资源 高级语言高级语言是面向过程的语言是面向过程的语言 高级语言高级语言具有很好的通用性和可移植性具有很好的通用性和可移植性 学习汇编语言的必要性学习汇编语言的必要性1.利用汇编语言可以设计出效率极高的核心底层程序。 2.用汇编语言编写的程序一般比用高级语言编写的程序执行得快,且所占内存较少。 3.汇编语言程序能够直接有效地利用机器硬件资源。 4.学习汇编语言对于理解和掌握计算机硬件组成及工作原理是十分重要的。4.3.2 4.3.2 汇编语言源程序的组成汇编语言源程序的组成汇编语言源程序的组成汇编语言源程序的组成 1 1汇编语言源程

82、序的结构汇编语言源程序的结构(Program Structure) (Program Structure) 例例 将将一一个个8位位二二进进制制数数的的高高4位位和和低低4位位分分别别转转换换为为两两个个ASCII字符字符 ,完整的汇编语言源程序如下:,完整的汇编语言源程序如下: NAME HEXTOASC;*DATA SEGMENT ; 数据段定数据段定义义开始开始HEX DB 5AHASC DB 2 DUP(?)DATA ENDS ; 数据段定数据段定义结义结束束;*;*STACK SEGMENT ; 堆堆栈栈段定段定义义开始开始 DB 256 DUP(S)TOP EQU $ - STAC

83、KSTACK ENDS ; 堆堆栈栈段定段定义结义结束束;*;*CODE SEGMENT ; 代代码码段定段定义义开始开始 ASSUME CS:CODE, DS:DATA, SS:STACKSTART: MOV AX, DATA ; 主程序开始主程序开始 MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP MOV BX,OFFSET ASC MOV AL,HEX MOV AH,AL MOV CL,4 SHR AL,CL CALL NEAR PTR CONVERT HLT ; 主程序主程序结结束束 CONVERT PROC ; 过过程程(子程序子程序)定定义义

84、开始开始 AND AL,0FH CMP AL,10 JB NUM ADD AL,7NUM: ADD AL,0 RETCONVERT ENDP ; 过过程程(子程序子程序)定定义结义结束束CODE ENDS ; 代代码码段定段定义结义结束束;* END START ; 程序程序结结束束要点总结:汇编语言源程序由汇编语言源程序由段结构段结构组成。组成。一个段一个段由由 “ “SEGMENTSEGMENT”(段定段定义义开始开始)和和“ENDSENDS”(段定段定义结义结束束)语语句来定句来定义义。每个段都有每个段都有唯一的唯一的段名段名,且前后必须一致。,且前后必须一致。不同不同段段的段名的段名不

85、能相同不能相同。数据段、堆数据段、堆栈栈段和代段和代码码段的段的作用各不相同作用各不相同。各个段都由一系列各个段都由一系列语语句句组组成成。语语句包括句包括指令指令语语句和句和伪伪指令指令语语句句。2 2汇编语言的语句格式汇编语言的语句格式(Statement Formats)(Statement Formats) 汇编语言程序的每行语句由汇编语言程序的每行语句由14个部分组成。个部分组成。指令语句和伪指令语句在格式上稍有区别,指令语句和伪指令语句在格式上稍有区别,指令指令语句的标号后有冒号语句的标号后有冒号“:”,而,而伪指令伪指令语句的标语句的标号后则没有冒号。号后则没有冒号。 指令语句的

86、格式为:指令语句的格式为:LABEL: OPERATION OPERAND ;COMMENT标号标号域域 指令助记符指令助记符域域 操作数操作数域域 注释注释域域伪指令语句的格式为:伪指令语句的格式为:LABEL OPERATION OPERAND ;COMMENT标号标号域域 伪指令助记符伪指令助记符域域 操作数操作数域域 注释注释域域 一行最多可有一行最多可有132132个字符个字符 注注: 指令助记符前面还可以有指令助记符前面还可以有 前缀前缀 。 汇编语言程序语句中的四项,均可以用汇编语言程序语句中的四项,均可以用大写大写、小写小写或或混合编写混合编写。 语句的各部分之间至少用一个语句

87、的各部分之间至少用一个空格空格分开分开3.3.标号标号( (Label)Label) ( (含数据变量标号和程序位含数据变量标号和程序位置标号置标号) )标标号号是一个自行设计的标识符或名称,最多可由31个字母、数字和特别字符(?、-、$)等组成。但不能用数字开头。不能用数字开头。不能为汇编语言的保留字不能为汇编语言的保留字。注:保留字指有专门用途的字符或字符串,如CPU的寄存器名、指令助记符、伪指令助记符等。(1) 数据变量标号的数据变量标号的三种属三种属性性 段值:段值:即所在段的段地址。 偏移量:偏移量:即数据变量所在位置的地址与其段地址之差值。 类型:类型:指该数据变量是字节、字还是双

88、字。(2) 程序位置标号的程序位置标号的两种属性两种属性 NEAR段内调用或转移标号。 FAR段间调用或转移标号。4. 4. 4. 4. 操作数操作数操作数操作数域域域域(Operand Fields)(Operand Fields)(Operand Fields)(Operand Fields)操操作作数数可可以以是是常常数数、变变量量、标标号号、寄寄存存器名器名或或表达式表达式(1)常常数数:二进制、八进制、十进制、十六进制或ASCII码字符串。(2)寄存器名寄存器名、标号标号、变量变量 例:指令MOVAL,HEX中,AL为寄存器名,HEX为变量名。(3)表达式表达式:由运算符运算符连接起

89、来的式子叫表达式,汇编程序在对其汇编汇编时,按一定的规则对表达式进行运算后得到一个数值数值或一个地址地址。表达式可分为算算术术表表达达式式、逻逻辑辑表表达达式式、关关系系运运算算表表达达式式、分分析析运运算算表表达达式式和合合成成运运算算表达式。表达式。用算术运算符+、-、*、/和MOD连接的表达式。 算术表达式算术表达式用逻辑运算符AND、OR、XOR和NOT连接的表达式。 逻辑表达式逻辑表达式例如:例如:5*8+305*8+30, 128/100128/100,206 MOD 128 206 MOD 128 等算术等算术表达式。表达式。 逻辑表达式的结果可能为逻辑表达式的结果可能为8 8位

90、位或或1616位位二进制二进制数,视参加运算的数的字长而定。数,视参加运算的数的字长而定。 逻辑运算指令中可以包含有逻辑表达式,如逻辑运算指令中可以包含有逻辑表达式,如指令:指令:AND AL, 10101010B AND 0FH 左边第一个左边第一个AND为为逻辑运算指令逻辑运算指令, 第二个第二个AND为为逻辑运算符逻辑运算符, 10101010B AND 0FH 为为逻辑表达式逻辑表达式,其结果在汇编时,其结果在汇编时即已确定为:即已确定为:00001010B,故上述指令等价于故上述指令等价于: AND AL, 00001010B用EQ、NE、LT、GT、GE和LE连接的表达式。若条件成

91、立,其值为1,否则为0。 关系运算表达式关系运算表达式分析运算表达式把存储器操作数分解为几个组成部分;而合成运算式是把这些组成部分综合为存储器操作数。分析运算表达式和合成运算表达式例如:指令例如:指令 MOV BX, 5 GT 3 等价于等价于 MOV BX, 0FFFFH 分析运算表达式和合成运算表达式的操作分析运算表达式和合成运算表达式的操作对象都为对象都为存储器操作数存储器操作数。 存储器操作数表示变量、符号地址、存储存储器操作数表示变量、符号地址、存储单元等与存储器单元等与存储器地址地址有关的量。有关的量。 分析运算表达式把存储器操作数分析运算表达式把存储器操作数分解分解为几为几个部分

92、,如分解出个部分,如分解出段值段值、偏移量偏移量、类型类型等;等; 合成运算表达式则把这些组成部分合成运算表达式则把这些组成部分综合综合为为存储器操作数。存储器操作数。 4.4 4.4 伪指令及其应用伪指令及其应用指指令令语语句句:汇编程序把它们翻译成机器代码,命令8086执行对应操作。伪伪指指令令语语句句:汇编程序并不把它们翻译成机器代码,只是用来指示、引导汇编程序在汇编时做一些操作,它本身不占用存储单元。* 程序分段及存储器分配程序分段及存储器分配* * 变量定义及存储器申请变量定义及存储器申请* * 过程定义过程定义* * 符号定义符号定义* * 程序模块定义与通信程序模块定义与通信*

93、* 宏定义及宏调用宏定义及宏调用* * 条件汇编条件汇编* * 格式控制,列表及其他功能格式控制,列表及其他功能伪指令主要分为下列几类:伪指令主要分为下列几类:4.4.1 4.4.1 段定义伪指令段定义伪指令段定义伪指令段定义伪指令SEGMENT/ENDSSEGMENT/ENDS1.SEGMENT和ENDS 定义方式:定义方式:段名SEGMENT定位方式组合方式类别名语句1语句2段名ENDS段段名名是赋予该段的一个名称,SEGMENT与ENDS必须成对出现,且前面的段名要相同,段名的取法与文件名、标号及变量名等相同。(1) 段名段名LINK程序除完成段与段的联合操作以外,还把联合后得到的各个段

94、互相衔接起来,段与段的衔接方式衔接方式叫做定位方式,共4种。(2) 定位方式定位方式 WORD (字字):表表示示段段从从地地址址是是一一个个最最低低位位为为0的二进制数的二进制数开始。开始。PAGE(页页):表表示示段段从从一一个个页页的的边边界界,即即十十六进制数六进制数表示地址时表示地址时最低两位均为最低两位均为0处处开始。开始。 PARA (缺缺省省):表表示示段段从从一一个个节节的的边边界界,即即用用十六进制数十六进制数表示地址时表示地址时最低位为最低位为0处开始。处开始。 BYTE (字节字节):表示段可从表示段可从任一地址任一地址开始开始。BYTEXXXXXXXXXXXXXXXX

95、XXXXBWORDXXXXXXXXXXXXXXXXXXX0 BPARAXXXXXXXXXXXXXXXX0 0 0 0BPAGEXXXXXXXXXXXX0 0 0 0 0 0 0 0BX表示可取表示可取0或或1定位类型定位类型 起起 始始 地地 址址(3) 组合方式组合方式程序不同模块中具有相同性质的段,若使用同样的段名,则连接时就会把同名的段按照指定的方式组合起来,组合方式共有6种。 表示该段与其他模块的段没有任何关系,每段都有自己的基址。这是缺省缺省方式。 NONE( 缺省缺省)方式:方式: STACK方式方式:连接时把所有STACK方式的同名段连接成一个段,运行时就是SS的装入值,且栈指针

96、SP指向该段的起始地址。 PUBLIC方式方式:表示该段与其他模块中说明为PUBLIC方式的同名段互相组合成一一个个逻逻辑辑段段,公用一个段址,运行时装入同一个物理段中。 MEMORY方式:方式:表示该段应定位在所有其他段的上面,若有多个段选用MEMORY,则除第一个之外,其余段均作为COMMON处理。 COMMON方式方式:表示该段与其它模块中所有已说明为COMMON的同名段共享相同的存储区域,即具有相同的段起始地址,共共享享的的长长度度为为模模块同名段中最大长度块同名段中最大长度。 AT方式方式:表示该段按绝绝对对地地址址定位,其段地址即为其后表达式的值,位移量为0。(4) 类别名类别名是

97、一个用单单引引号号括起来的字字符符串串,LINK程序把类别名相同的所有段放在连续的存储区域内,先出现的在前,后出现的在后。例:例: A SEGMENTFATABSEGMENTBAZEC SEGMENTBAZBD SEGMENTZOUCESEGMENTFATD LINK 处理前处理前 LINK 处理后处理后2.GROUP伪指令格式:格式:组名组名 GROUP 段名段名 ,功功能能:用来把模块中若干不同名的段集合成一个组,使其装入同同一一个个物物理理段段中,组内各段之间的跳转可视为段段内跳转内跳转。注注:组名与段名是一样的取名规则,是代表该组的段地址,格式中的段名也可用表达式SEG变量变量或SEG

98、标号标号。4.4.2 4.4.2 位置计数器位置计数器位置计数器位置计数器$ $和定位伪指令和定位伪指令和定位伪指令和定位伪指令ORG ORG 1. 位置计数器$ 汇编程序专门设置了一个表示汇编程序专门设置了一个表示当前位置当前位置的计数器,的计数器,称称位置计数器位置计数器$ $。正常情况下,汇编程序每扫描一个。正常情况下,汇编程序每扫描一个字节,位置计数器的值便加字节,位置计数器的值便加1 1。语句:TOP EQU $ - STACK含义:含义:当前位置计数器的值当前位置计数器的值$ $减去减去STACKSTACK代表的起始位代表的起始位 置的值,然后把两者的差值赋予符号常量置的值,然后把

99、两者的差值赋予符号常量TOPTOP。语句:JMP $ 含义:程序跳转到本条指令执行程序跳转到本条指令执行。格式:格式:ORG 数据表达式数据表达式功功能能:把位置计数器的值设置为表达式的值。ORG后面的一条指令性语句或数据区定义命令即从指指定定的的位位置置处进行汇编。2. ORG伪指令格式:格式:ASSUME 段寄存器段寄存器:段名段名, 段寄存器段寄存器:段名段名,功功能能:用于告知汇编程序,段寄存器CS、DS、ES和SS的内容将被设定为那些段或组的段址段址。4.4.3 4.4.3 段寻址伪指令段寻址伪指令段寻址伪指令段寻址伪指令ASSUMEASSUME 注注:(1)段段名名可以是已定义过的

100、任何段段名名或组名组名;(2)ASSUME语句只是对各段的性质进行了说说明明,并未向各个段寄存器真正赋值。要向各个段寄存器赋赋值值,必须在程序中用指令语句实现 。(3)除除CS外,DS、ES、SS的设置必须通过指令性语句来完成。例例 CODE SEGMENT ASSUME CS:CODE,DS:DATA, SS:STACK MOVAX,DATAMOVDS,AX ;设置设置DSMOVAX,STACKMOVSS,AX ;设置设置SS CODE ENDS4.4.44.4.4 过程定义伪指令过程定义伪指令过程定义伪指令过程定义伪指令PROC/ENDPPROC/ENDP 过程过程即是子程序子程序。汇编语

101、言规定必须对过程进行定义,以确定过程的三种属性过程的三种属性。过程的属性确定之后,就可对调用指令CALL进行正确汇编,决定是产生近调用近调用指令还是远调用远调用指令。1. 过程的三种属性 段段属性:过程所在段的段地址。 偏移量偏移量属性:过程所处位置的段内偏移地址。 类型类型属性(NEAR或FAR)。过程为NEAR或FAR类型。使用格式:过程名使用格式:过程名 PROC NEAR/FAR RET 过程名过程名 ENDPNEAR-近过程。该过程与调用指令CALL处在同处在同 一个代码段一个代码段中(段名相同)。FAR -远过程。该过程与调用指令CALL处在不同不同的代码段中(段名不同)。 2.

102、过程的定义功功能能:把把具具有有一一定定功功能能的的程程序序段段设设计计成成为为一一个个过过程程(子程序子程序),便于实现模块化的程序设计。,便于实现模块化的程序设计。注注:(1)CALL指令中过程名起着标号的作用。有段属性、偏移量属性和类型属性(NEAR和FAR)。(2)子程序中至少要有一个RET。过过过过程程程程名名名名是是是是为为为为该该该该过过过过程程程程指指指指定定定定的的的的一一一一个个个个名名名名称称称称,与与与与变变变变量量量量、标号的定义法相同。标号的定义法相同。标号的定义法相同。标号的定义法相同。(3)变量的类型类型:字节、字、双字等。任何变量均有下列三种属性。(1)段属性

103、段属性即变量所使用的段;(2)段内偏移属性偏移属性;4.4.5 4.4.5 数据定义伪指令与存储器分配数据定义伪指令与存储器分配数据定义伪指令与存储器分配数据定义伪指令与存储器分配 1. 1. 变量的三种属性变量的三种属性变量的三种属性变量的三种属性2.变量定义及存储器申请伪指令变量定义及存储器申请伪指令DB/DW/DD (1) 格式格式1:变量名变量名 DB/DW/DD表达式表达式功能功能:定义一变量,并为其定义一变量,并为其分配一定数量分配一定数量的存储单元的存储单元; 变量的变量的初值初值由表达式的值指定;由表达式的值指定; 若初值若初值可任意可任意,则用问号(,则用问号(? ?)表示。

104、)表示。 变量名可以变量名可以省去省去 。 DB定义字节型字节型变量,每个变量分配1个存储单元DW-定义字型字型变量,每个变量分配2个存储单元DD-定义双字型双字型变量,每个变量分配4个存储单元BUFFER DW 1,0,-1 ;定义了三个定义了三个字字单元单元STR DB Program ;定义了一个定义了一个字符串字符串 注:在存放字变量时,注:在存放字变量时,低字节在前低字节在前,高字节在后,高字节在后 在存放字符串时,存储的是字符的在存放字符串时,存储的是字符的ASCII码码。HEX_OFF DW HEX ;定义了一个定义了一个字字单元,其初值为已单元,其初值为已 ;定义变量;定义变量

105、HEX的偏移量的偏移量。 DVAR DD 12345678H ;定定义义了一个了一个双字双字单单元,存放的元,存放的;顺顺序序为为:78H、56H、34H、12H例:例:HEX DB 5AH ; 定义定义字节字节变量变量HEX,并赋予初值,并赋予初值5AHVWORD DW 1234H ;定义;定义字字变量变量 ASC DB 2 DUP(?) 功能:分配功能:分配2个字节个字节单元,单元,初值任意初值任意 BUF DW 100 DUP(0) 功能:分配功能:分配100个字个字单元,单元,初值为初值为0 ZIP DB 3 DUP (0,2 DUP (1) 功能:存储单元功能:存储单元依次依次初始化

106、为:初始化为: 0,1,1,0,1,1,0,1,1。(2) 格式格式2:变量名变量名 DB/DW/DDDUP 表达表达式式内存分配情况表内存分配情况表 (设:DS=5566H)例:例:ORG1000HHEXDB78HDB?DB?BCDDB320-5ABDBABBADWAB 偏移地址偏移地址 内容内容变量名5566:1000H78HHEX1001H3FH1002HX1003H37HBCD1004H41HAB1005H42H1006H42HBA1007H41H内存分配情况表内存分配情况表(续续)FEHDW0FEHFEHOFFDWFEHFEHSEGDWSEGFEHFEHPRTDDFEH5566:10

107、08H0FEHFEH1009H00H100AH08HFEH-OFF100BH10H100CH66HFEH-SEG100DH55H100EH08HFEH-PRT100FH10H1010H66H1011H55H 变量经过定义及存储器申请之后,在程序变量经过定义及存储器申请之后,在程序中即可像高级语言一样使用。中即可像高级语言一样使用。 MOV AL,HEX ;取变量取变量HEX的的内容内容送送 ;AL寄存器寄存器。MOV ASCBX,AL ;表示:表示:取变量取变量ASC的的偏移偏移地地 址,与址,与BX寄存器的寄存器的内容内容相加相加,得到,得到存储器操作数的有效地址存储器操作数的有效地址EA,

108、再将再将AL寄存器的内容寄存器的内容送入送入该单该单元元。 3 3 3 3变量的使用变量的使用变量的使用变量的使用记录名记录名 RECORD 字段名字段名:宽度宽度=初值表达式初值表达式 ,4.4.6 4.4.6 记录与结构定义伪指令记录与结构定义伪指令记录与结构定义伪指令记录与结构定义伪指令(RECORDRECORD、STRUC/ENDSSTRUC/ENDS) 1 1 1 1记录定义伪指令记录定义伪指令记录定义伪指令记录定义伪指令RECORD RECORD RECORD RECORD 记录记录:能进行:能进行位处理位处理的的8位位或或16位位二进制数二进制数。字段字段:记录中相邻的若干位构成

109、一个:记录中相邻的若干位构成一个字段字段。记录类记录类型型 :说明记录中有:说明记录中有哪些字段哪些字段,各,各字段分别字段分别有有多少位多少位。(1)(1)记录类型的定义记录类型的定义 记录名和字段名遵循标号的取名法则。宽度表示该字段占有的二二进进制制位位数数,最多不能超过16位,初值表达式表示该字段的初值初值,可省。如如: COLOR RECORD X : 3=5 ,Y:4=12 ,Z:9=255 1011100011111111151312980COLORXYZ注注:当定义中的字段总位数不能占满整个字节或字时,汇编程序就把所定义的字段与记录的低位端低位端对齐。 如如: COOL RECO

110、RD A:5=17, B:7=127XXXX100011111111151211760COOL未定义AB例例:MEN RECORD YRS:6,SEX:1,STATUS:1即定义了一个即定义了一个个人记录表个人记录表,每个记录项占一个字节,包含每个记录项占一个字节,包含3个字段个字段,其中工龄(其中工龄(YRS)占)占6位,性别(位,性别(SEX)占一)占一位,健康状态(位,健康状态(STATUS)占一位。)占一位。(2) 记录类型变量的定义及存储器分配记录类型变量的定义及存储器分配记录可以用记录名称作为操作符。记录可以用记录名称作为操作符。名称名称记录名称记录名称表达式表达式DUP()一般格

111、式:一般格式:定定义义了了一一个个记记录录型型变变量量,其其字字段段X X、Y Y和和Z Z的的初值分别为初值分别为5 5(缺省值),(缺省值),1515和和9,9,即即COLOR1=COLOR1= 1011,1110,0000,1001B如:COLOR1COLOR(3) 记录的使用记录的使用 定义了记录型变量之后,在程序中可像一个字节或字型变量来使用。如:如:MOV DX, COLOR1 指令执行后,DX=1011,1110,0000,1001B=BE09H(4) 记录专用操作符记录专用操作符 MASK操作符:使字段名所在位置的位全为1,其余为0。如:ANDDX,MASKZ该指令汇编的结果为

112、:ANDDX,01FFH WIDTH操作符:返回纪录或纪录中字段的位数。 2. 2. 结构结构结构结构定义伪指令定义伪指令定义伪指令定义伪指令 STRUC/ENDSTRUC/END伪指令伪指令伪指令伪指令 结结构构是是一一种种复复杂杂的的数数据据类类型型。结结构构体体中中包包含含若若干个字段,其数据类型一般为基本的数据类型。干个字段,其数据类型一般为基本的数据类型。 结构名称结构名称STRUC字段名称字段名称DB/DW/DD结构名称结构名称ENDS表达式,表达式DUP(表达式,) 结构类型的定义结构类型的定义 例如:COURSESTRUCNODD?CNAMEDBAssemblerSCOREDW

113、0COURSEENDS 定义了结构名为定义了结构名为COURSE的结构,该结构包含三的结构,该结构包含三个个成员变量成员变量,结构,结构体长度为体长度为1515个字节个字节(4+9+2=15) (4+9+2=15) 。 (2) (2) 结构类型变量的定义及存储器分配结构类型变量的定义及存储器分配如: COURSE1COURSE定义一个结构变量COURSE1,其初值为缺省。格式:变量名 结构名结构名 (3) (3) 结结构的使用构的使用 定义了结构型变量之后,在程序中即可使用。格式:结构变量名结构变量名. .字段名字段名如:MOV AX, COURSE1.SCORE1. EQU1. EQU伪指令

114、伪指令伪指令伪指令格式:符号名格式:符号名 EQU 数值表达式数值表达式功功能能:为常量、变量、表达式或其他符号定义一个名字,但不申请分配内存。如:THREEEQU3TOPEQU$-STACK4.4.7 4.4.7 符号定义伪指令(符号定义伪指令(符号定义伪指令(符号定义伪指令(EQUEQU、LABELLABEL) “=”伪操作与EQU相似,其区别是前者可重复定义而后者不能。 使用EQU可使程序简单明了和便于修改。注:注: EQU可用PURGE解除。2. LABEL2. LABEL伪指令伪指令伪指令伪指令格式:变量名格式:变量名/标号标号 LABEL 类型类型功功能能:为为当当前前存存储储单单

115、元元定定义义一一个个指指定定类类型型的变量名或标号;的变量名或标号; 其其类类型型可可以以为为BYTE、WORD、DWORD、 结结 构构 名名 、 记记 录录 名名 、NEAR和和FAR等。等。BYTE_ARRAY LABEL BYTE;定义定义字节型字节型数组标号数组标号WORD_ARRAY DW 50 DUP(?) ;定义定义字型字型数组数组例如定义不同类型的数组:程序中的用法:程序中的用法: MOV AL, BYTE_ARRAY2 ;将将2号号字节字节单元内容送单元内容送AL MOV AX, WORD_ARRAY0 ;将将0号号字字单元内容送单元内容送AX又如:又如:TRANS_N L

116、ABEL NEAR TRANS PROC FAR这样TRANS不仅适合远程远程调用和转移, 也可用新名TRANS_N适合近程近程调用和转移。 汇编语言程序可划分为许多模块,对每个模块独立地进行汇编及调试(见下图),一般从低层低层到高层高层逐步进行。4.4.8 4.4.8 程序模块定义伪指令(程序模块定义伪指令(程序模块定义伪指令(程序模块定义伪指令(NAME/ENDNAME/END、PUBLIC/EXTRNPUBLIC/EXTRN) 主模块EXTRNPUBLIC二级子模块1PUBLIC二级子模块2PUBLICPUBLIC二级子模块n1二级子模块nPUBLICPUBLICPUBLIC一级子模块1

117、EXTRN一级子模块2EXTRN一级子模块mEXTRN汇编语言程序的模块结构1. NAME1. NAME和和和和ENDEND伪指令伪指令伪指令伪指令功功能能:定义一个模块,作为一个独立的汇编单位,NAME缺省时模块若使用了TITLE语句,则TITLE语句中前6个字符为模块名,否则源文件名将作为模块名。格式:格式:NAME 模块名模块名 END 标号标号注注:一一个个模模块块是是一一个个独独立立的的汇汇编编单单位位,汇汇编编处理只进行到处理只进行到模块结束语句模块结束语句ENDEND为止为止。注:符符号号必必须须用用“ ,”分分开开,且且均均在在本本模块中定义过。模块中定义过。注:注:2. PU

118、BLIC2. PUBLIC伪指令伪指令伪指令伪指令格式:格式:PUBLIC 符号表符号表功功能能:用来说明该模块中被定义的那些常常量量、变变量量和标标号号(含过程名)可以被其他模块所引用。如:PUBLIC ABC,BCD,CDE3. EXTRN3. EXTRN伪指令伪指令伪指令伪指令格式:格式:EXTRN 符号:类型,符号:类型,功功能能:指出本模块中需要引用但却在其他模块中定义并说明为PUBLIC属性的符号(含常量,变量,标号和过程)。被引用符号的类型类型包括:BYTE、WORD、DWORD、NEAR、FAR、ABS(符号常量)。如:EXTRN ABC:WORD,BCD:ABS,CDE: N

119、EAR4.5 4.5 汇编语言属性操作符汇编语言属性操作符1. 1. 分析操作符(数值返回操作符)分析操作符(数值返回操作符)分析操作符(数值返回操作符)分析操作符(数值返回操作符) 4.5.1 4.5.1 分析操作符(分析操作符(分析操作符(分析操作符(SEGSEG、OFFSETOFFSET、TYPETYPE、LENGTHLENGTH、SIZESIZE) 返回的是变量或标号的段段地地址址,偏偏移移地址地址及类型类型的属性值。格式格式:分析运算符分析运算符 变量或标号变量或标号其运算的结果为一常数(1) SEG(1) SEG取段址算符取段址算符取段址算符取段址算符(2) OFFSET(2) O

120、FFSET取取取取偏移地址算符偏移地址算符偏移地址算符偏移地址算符功能功能:分离出该变量或标号的段地址如:MOVAX,SEGBUF功能功能:分离出该变量或标号的偏移地址如:MOVSI,OFFSETBUF(3) TYPE(3) TYPE取取取取类型算符类型算符类型算符类型算符(4) LENGTH(4) LENGTH取取取取变量所含存储单元的个数变量所含存储单元的个数变量所含存储单元的个数变量所含存储单元的个数功能功能:分离出该变量所含存储单元的个数。功能功能:分离出该变量或标号的类型的字节数。变量类型为BYTE、WORD和DWORD时,返回的值分别为1、2和4;标号类型为NEAR或FAR时,则返

121、回-1或-2。注注意意:LENGTH运运算算符符只只返返回回变变量量定定义义时时最最外外层层DUP的的重重复复次次数数。若若无无DUP,不不管管后后面定义了多少单元,都面定义了多少单元,都返回返回1 1。 如:如: BUF1 DB 100 DUP(0) BUF2 DW 10,5 DUP(2) BUF3 DD 5 DUP(1,2 DUP(0)则则: LENGTH BUF1 = 100 LENGTH BUF2 = 1 LENGTH BUF3 = 5。(5) SIZE(5) SIZE取变量所含存储区的总字节数。取变量所含存储区的总字节数。取变量所含存储区的总字节数。取变量所含存储区的总字节数。功能功

122、能:SIZE = LNGTH*TYPE 例:例:SIZE BUF1 = 100 (因为(因为TYPE BUF1 = 1) SIZE BUF2 = 2 (因为(因为TYPE BUF2 = 2) SIZE BUF3 = 20 (因为(因为TYPE BUF3 = 4)格式格式:属性:属性 PTR 表达式表达式其中表达式其中表达式:是变量、标号或数值:是变量、标号或数值 变量的属性有:变量的属性有:BYTE、WORD和和DWORD; 标号的属性有:标号的属性有:NEAR和和FAR;4.5.2 4.5.2 属性修改操作符(属性修改操作符(属性修改操作符(属性修改操作符(PTRPTR、THISTHIS、S

123、HORTSHORT) 1. PTR1. PTR操作符操作符操作符操作符 PTR操作符用于暂时暂时修改变量或标号的原有属性原有属性。功功能能:PTR把它左边的属性指派给它右边的变量、标号或数值如:如:(1) INC BYTE PTR BX;说明是字节操作说明是字节操作 (2) ADD DX, WORD PTR FOOB20 ;说明;说明FOOB数组在这里作为字型数组使用数组在这里作为字型数组使用新存储器操作数的段地址和段内偏移量与PTR运算符右边的操作数的对应量相同。PTR给已分配的存储器一个另外的定义但并不重新分配存储器。2. SHORT2. SHORT操作符操作符操作符操作符SHORT用于条

124、件转移、转移和调用指令中,指出其转移的相对位移量不超过一一个字节个字节所能表达的范围。3. THIS3. THIS操作符操作符操作符操作符THIS操作符与PTR操作符有类似的功能,但新的属性放在THIS的右边右边。格式:格式: THIS 类型类型/距离距离其中类型是:BYTE、WORD和DWORD,距离是:NEAR和FAR属性。功功能能:与PTR类似建立一个新的存储器地址操作数,但不分配存储器,其类型由THIS指定。(1) FOOB EQU THIS BYTE(2) FAR-OUT EQU THIS FAR如:1、参看下列程序段、参看下列程序段ORG 1000H DATASEGMENT VAR

125、1 DW 5 DUP(10,?),?) VAR2 DB WELCOM,0DH,0AH LEVEREQU VAR2-VAR1 DATA ENDS问:(问:(1)上述语句为)上述语句为VAR1,VAR2各分配多少字节存储单元?各分配多少字节存储单元?(2)LEVER的值为多少?的值为多少?(1) VAR1分配分配20个字节存储单元,个字节存储单元,VAR2分配分配8个字节存储单元个字节存储单元(2)LEVER的值为的值为202、源程序如下:、源程序如下:CMP AX, BXJNC L1JZ L2JNS L3JNO L4JMP L5设设AX=74C3H,BX=95C3H,则程序最后将转到哪个标号处,

126、则程序最后将转到哪个标号处执行?试说明理由执行?试说明理由。程序将转到L5标号处执行。执行CMP指令后有OF=1,CF=1,结果不为0,为负。 4.6 4.6 汇编语言程序的上机过程汇编语言程序的上机过程 4.6.1 4.6.1 汇编语言程序上机运行的软件环境汇编语言程序上机运行的软件环境汇编语言程序上机运行的软件环境汇编语言程序上机运行的软件环境DOS操作系统下,编辑、修改和运行汇编语言程序,需要用文本编辑软件、宏汇编程序、连接程序和调试程序。文本编辑软件:EDIT.EXE等宏汇编程序:MASM.EXE,TASM.EXE等连接程序:LINK.EXE,TLINK.EXE等调试程序:CV.EXE

127、,TD.EXE等1.masm微软开发支持win32编程,8086虚拟机编程只有编辑器,没有现成的调试器文档较少不能运行在linux机器上,免费获得2.tasmborland开发有强大的调试器和文档兼容性好,不是免费获得的3.nasm开源软件免费获得,而且可以在linux和windows上运行由于操作系统原因,现在较多人使用masm进行win32程序开发4.6.2 4.6.2 源程序的编辑与汇编源程序的编辑与汇编源程序的编辑与汇编源程序的编辑与汇编1. 1. 编辑源程序编辑源程序编辑源程序编辑源程序 C:ASMEDIT HEXTOASC.ASM(回车)回车)2. 2. 汇编源程序汇编源程序汇编源

128、程序汇编源程序 C:ASMTASM HEXTOASC (回车)回车)在汇编中,如果有语法错误,会给出提示信息,指出错误的类型、行号。当汇编无错之后,会自动生成目标文件(文件扩展名为OBJ)。注:待编辑的文件扩展名必须为ASM。汇编程序通过ASSUME语句了解到运行时各段寄存器的设设定定值值后,就可以对被汇编的指令语句中的变量和标号作如下处理。3. 3. 汇编程序对变量和标号的处理汇编程序对变量和标号的处理汇编程序对变量和标号的处理汇编程序对变量和标号的处理 1.检查指令中所引用的变量和标号是否合理,即它们的段段属属性性是否和某个段寄存器的段假设值相符。2.检查是否需要为所引用的变量和标号产生跨

129、跨段段前前缀缀字节,即检查变量和标号的段属性是否与硬件为该指令所规定的段寄存器的假设值相符。4.6.3 4.6.3 目标程序的连接目标程序的连接目标程序的连接目标程序的连接 C:ASMTLINK HEXTOASC (回车)回车)连接成功后,将生成可执行程序HEXTOASC.EXE。4.6.4 4.6.4 程序的调试与运行程序的调试与运行程序的调试与运行程序的调试与运行 1 1调试可执行程序调试可执行程序调试可执行程序调试可执行程序 利用TurboDebuger(TD)对可执行程序进行调试,以检查程序可能存在的各种错误:C:ASMTD HEXTOASC.EXE (回车)回车)程序在存储区中程序在

130、存储区中存放的逻辑地址存放的逻辑地址源程序部分源程序部分程序执行后各寄存器、程序执行后各寄存器、标志位的结果标志位的结果数据段中存放的数据段中存放的40个个“A”及对应的及对应的ASCII码码DEBUG调试环境如下:调试环境如下:2 2运行可执行程序运行可执行程序 C:ASMHEXTOASC (回车)回车)启动程序运行,并检查结果,如果不正确,则借助调试工具(单步执行、分段执行等)查找出错误,再调用文本编辑软件EDIT修改源程序,并重新开始上述过程,直到调试通过时为止。 4.7 4.7 汇编语言程序与汇编语言程序与DOSDOS的接口的接口 4.7.1 DOS4.7.1 DOS和和和和BIOSB

131、IOS的功能调用的功能调用的功能调用的功能调用 1 1DOSDOS系统功能调用的一般步骤系统功能调用的一般步骤系统功能调用的一般步骤系统功能调用的一般步骤DOS为为磁盘操作系统磁盘操作系统(Disk Operating System)的简称。的简称。DOS提供了极为丰富的提供了极为丰富的子程子程序序,能够实现控制键盘、显示器、读写文件、,能够实现控制键盘、显示器、读写文件、串行通信等串行通信等一系列功能一系列功能。使用使用使用使用DOSDOS系统功能调用的系统功能调用的系统功能调用的系统功能调用的一般过程一般过程一般过程一般过程:功能功能调用号调用号AH置置入口参数入口参数执行执行 “INT

132、21H ”分析分析出口参数出口参数系统功能调用的方法系统功能调用的方法(1 1)键盘输入)键盘输入)键盘输入)键盘输入 (1(1号调用号调用号调用号调用) )格式:格式:MOV AH,1 INT 21H功功能能:等待从键盘输入一个字符并将输入字符的ASCII码码送入寄存器AL中,同时在显示器上显示该字符,碰到CTRL+Break则退出。2 2DOSDOSDOSDOS系统功能调用的一般步骤系统功能调用的一般步骤系统功能调用的一般步骤系统功能调用的一般步骤(2 2)显示单个字符)显示单个字符)显示单个字符)显示单个字符 (2(2号调用号调用号调用号调用) )格式:格式:MOV AH,2 MOV D

133、L,待显字符的待显字符的ASCII码码 INT 21H功功能能:将DL中的字符送显示器显示,若为CTRL+Break的ASCII码码则退出。(3 3)控制台输入)控制台输入)控制台输入)控制台输入 (8(8号调用号调用号调用号调用) )格式:格式:MOV AH,8 INT 21H功功能能:与1号号调调用用相似,但只从键盘上输入而不显示不显示。(4) (4) 显示字符串显示字符串显示字符串显示字符串 (9(9号调用号调用号调用号调用) )格式:格式:LEA DX,字符串首偏移地址字符串首偏移地址 MOV AH,9 INT 21H功功能能:将当前数据区中以$结尾的字符串送显示器显示。例如,要显示下

134、列DIS0数组变量中定义的字符串DIS0DBPRESSANYKEYTOQUIT,0DH,0AH,$程序如下:LEADX,DIS0MOVAH,09HINT21H(5) (5) 键盘输入字符串键盘输入字符串键盘输入字符串键盘输入字符串 (10(10号调用号调用号调用号调用) )格式:LEADX,缓冲区首偏移地址MOVAH,10INT21H功功能能:从键盘上往指定缓冲区中输入字符串并送显示器显示。如:BUFDB81DB?DB80DUP(0)注注:缓冲区应按规定的格式定义。:缓冲区应按规定的格式定义。BUF第第一一字字节节规规定定了了缓缓冲冲区区的的大大小小,从从键键盘盘输输入入的的字字符符串串从从第

135、第三三个个字字节节存存放放,第第二二个字节存放实际输入的字符个数。个字节存放实际输入的字符个数。3 3常用常用常用常用BIOSBIOS调用调用调用调用 BIOS为基本输入输出系统(为基本输入输出系统(Basic Input and Output System),),它提供了它提供了最底层最底层的控的控制程序制程序。 (1 1)设置显示器显示模式设置显示器显示模式设置显示器显示模式设置显示器显示模式 功功能能:设置显示器显示模式。显示模式代码见教材附录附录E。格式:MOVAH,00HMOVAL,显示模式代码INT10H(2 2)设置光标位置设置光标位置设置光标位置设置光标位置 功功能能:设置光标

136、位置,使字符从该位置处开始显示。MOVAH,02HMOVBH,页号MOVDH,行号MOVDL,列号INT10H4.7.2 4.7.2 用户程序与用户程序与用户程序与用户程序与DOSDOS的接口的接口的接口的接口 1 1程序段前缀程序段前缀程序段前缀程序段前缀PSP PSP 程序段前缀程序段前缀PSP是一个是一个256字节的区域,从页的字节的区域,从页的边界开始存放有关信息。用户程序可从边界开始存放有关信息。用户程序可从PSP中中获得有获得有关键盘输入参数等信息。关键盘输入参数等信息。 当当DOS加载一个可执行文件的程序代码到内存中去时,加载一个可执行文件的程序代码到内存中去时, 它首先为该程序

137、建立一个它首先为该程序建立一个程序段前缀程序段前缀PSP; 然后把可执行的程序代码加载到然后把可执行的程序代码加载到PSP后续的地址上;后续的地址上;并将程序段前缀并将程序段前缀PSP的段地址保存在的段地址保存在DS和和ES中;中; CS和和IP指向可执行程序代码的起始地址。指向可执行程序代码的起始地址。表表4.5 程序段前缀程序段前缀PSPPSP信息区的字段分布表信息区的字段分布表偏移量偏移量内容、含义内容、含义偏移量偏移量 内容、含义内容、含义00-01H返回返回DOS的指令(的指令(INT 20H)2E-31H保留02-03H分配给该程序的最后段的段地址 32-33H文件句柄表的长度04

138、-09H保留34-37H指向文件句柄表的远指针0A-0DH中断22H的地址(处理终止程序)38-4FH保留0E-11H中断23H的地址(处理Break)50-51H中断21H的功能调用12-15H中断24H的地址(处理严重错误)52-5BH保留16-17H保留5C-6BH参数区1(FCB1)18-2BH缺省的文件句柄表6C-7FH参数区2(FCB2)2C-2DH程序环境块的段地址80-FFH存储缺省DTA的缓冲区2用户程序与用户程序与DOS的接口的接口BEGINPROCFAR ;定义一个远过程;定义一个远过程START:PUSHDS;保存程序段前缀;保存程序段前缀PSP的段地址的段地址SUBA

139、X,AX;AX清零清零PUSHAX;保存程序段前缀;保存程序段前缀PSP的偏移地址的偏移地址MOVAX,DATA;取数据段段地址取数据段段地址MOVDS,AX;给;给DS重新赋值重新赋值RET;返回;返回DOSBEGINENDP;远过程定义结束;远过程定义结束 在在DOS操作系统下,用户程序的主程序对于操作系统操作系统下,用户程序的主程序对于操作系统而言,也是一个而言,也是一个过程过程,且必须说明为,且必须说明为FAR属性属性。例:。例:3 3结束用户程序返回结束用户程序返回结束用户程序返回结束用户程序返回DOSDOS的方法的方法的方法的方法 (1 1 1 1)INT 20H INT 20H

140、INT 20H INT 20H 说说明明:INT20H为系统“结束任务返回DOS”的子程序。(2 2 2 2)用户程序用)用户程序用)用户程序用)用户程序用RETRETRETRET指令返回指令返回指令返回指令返回 说明说明:用户程序必须定义为一个:用户程序必须定义为一个FAR过程。过程。(3 3 3 3)用)用)用)用DOSDOSDOSDOS系统功能调用系统功能调用系统功能调用系统功能调用(4CH)(4CH)(4CH)(4CH)返回返回返回返回 格式格式:MOVAH,4CHINT21H4.8 4.8 汇编语言程序设计的基本技术汇编语言程序设计的基本技术 4.8.1 4.8.1 简单程序设计简单

141、程序设计简单程序设计简单程序设计 例例 编写程序段,完成下面公式的计算编写程序段,完成下面公式的计算 ( 其中变量其中变量X和和Y是是32位位无符号数无符号数,变量,变量A,B和和Z是是16位无符号数位无符号数 ): (X-Y-29) Z的商的商A,(X-Y-29) Z的余数的余数BDATASEGMENTXDD453921F0HYDD123A6825HZDW0A86CHADW?BDW?DATAENDS;定义数据段CODESEGMENTMOVAX,WORDPTRX;取X的低位低位字MOVDX,WORDPTRX+2;取X的高位高位字SUBAX,WORDPTRY;与Y的低位字相减相减SBBDX,WO

142、RDPTRY+2;与Y的高位字相减,并考虑;低位的借位借位SUBAX,29D;结果的低位与29相减SBBDX,0;再减去减去可能产生借位借位DIVZ;32位无符号数(DX:AX);除以除以16位无符号数ZMOVA,AX;商在AX中,保存商保存商MOVB,DX;余数在DX中,保存余数余数CODEENDS ;定义代码段例例 编写程序段,完成下面公式的计算编写程序段,完成下面公式的计算: A=(X+Y)-(W+Z),其中其中X,Y,Z,W均为用均为用压缩压缩BCD码码表示的数。表示的数。DATA SEGMENT X DB 39H Y DB 25H W DB 86H Z DB 46H A DB ? D

143、ATA ENDS;定义数据段;定义数据段 MOV AL,W ADD AL,Z;AL=(W+Z) DAA;加法的十进制调整加法的十进制调整 MOV A,AL;调整后的结果存到单元A MOV AL,X ADD AL,Y;AL=(X+Y) DAA;加法的十进制调整 SUB AL,A;AL=(X+Y)-(Z+W) DAS;减法的十进制调整减法的十进制调整 MOV A,AL ; 结果送A程序如下程序如下: : 例:编写完整的汇编语言程序,用例:编写完整的汇编语言程序,用8086的的16位无符位无符号数乘法指令实现两个号数乘法指令实现两个32位无符号数的乘法运算位无符号数的乘法运算。 算算法法分分析析:8

144、086没没有有32位位无无符符号号数数乘乘法法指指令令,需需借借助助于于16位位无无符符号号数数乘乘法法指指令令做做4次次乘乘法法,然然后后把把部部分分积积相相加加,如下图所示。,如下图所示。ABBDCDADBCAC+部分积部分积1部分积部分积2部分积部分积3部分积部分积4最后乘积最后乘积ABCD完整的完整的汇编语言程序如下:汇编语言程序如下: NAMEMULTIPLY_32BITDATASEGMENTMULNUMDW8000H,0001H,0FFFH,0001H;定义;被乘数B、A与乘数D、CPRODUCTDW4DUP(?);定义乘积,低字在前DATAENDSSTACKSEGMENTPARA

145、STACKSTACKDB100DUP(?)STACKENDS例如,求:例如,求:0001 8000H*0001 0FFFH=0000000197FE8000HABCD CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前缀的段地址MOVAX,0PUSHAX;设置返回至DOS的段值和偏移量MOVAX,DATAMOVDS,AX;置数据段寄存器初值MOVBX,0MULU32:MOVAX,MULNUMBX;BAXMOVSI,MULNUMBX+4;DSIMOVDI,MULNUMBX+6;CDI MULS

146、I;BDMOVPRODUCTBX,AX;保存部分积1MOVPRODUCTBX+2,DXMOVAX,MULNUMBX+2;AAXMULSI ;ADADDAX,PRODUCTBX+2ADC DX, 0 ; 部分积2的一部分与部分;积1的相应部分相加MOVPRODUCTBX+2,AXMOVPRODUCTBX+4,DX;保存MOVAX,MULNUMBX;BAXMULDI;BCADDAX,PRODUCTBX+2;与部分积3的相应部分相加ADCDX,PRODUCTBX+4 MOVPRODUCTBX+2,AXMOVPRODUCTBX+4,DXPUSHF;保存后一次相加的进位标志MOVAX,MULNUMBX+

147、2;AAXMULDI;ACPOPFADCAX,PRODUCTBX+4;与部分积4的相应部分相加ADCDX,0MOVPRODUCTBX+4,AXMOVPRODUCTBX+6,DXRETSTARTENDPCODEENDSENDBEGIN程序的四大主要结构:顺序结构顺序结构分支结构分支结构循环结构循环结构子程序子程序任何复杂的程序都是由这些基本结构组成的。汇编语言程序设计归纳为如下七个步骤:(1)分析问题;(2)建立数学模型;(3)确定算法;(4)编制程序流程图;(5)内存空间分配;(6)编制程序与静态检查;(7)程序调试(动态检查)。汇编语言程序调试最有效的调试工具是汇编语言程序调试最有效的调试工

148、具是DEBUG调试调试软件。软件。程序中根据各种可能出现的情况及相应的处理方法分成若干支路,运行时,根据不同情况有选择地执行相应处理程序。例例 试编写程序段,实现符号函数。当当x 0时时当当x = 0时时当当x 0时时4.8.2 4.8.2 分支程序设计分支程序设计分支程序设计分支程序设计 相应的程序段为;相应的程序段为;SIGN:MOVAX,BUFFER;(BUFFER)=XMOVBX,0;预置X=0的标志标志:0BXAND AX ,AX ; 做一次“与”运算,以把X ;的特征特征反映到标志位JENEXT;若X确实为0,则转NEXTJNSPLUS;X为正数,则转PLUSMOVBX,-1;X为

149、负数,则-1BXJMPNEXTPLUS:MOVBX,1NEXT: (1)双分支结构 (2)多分支结构 例:在数据段中定义了例:在数据段中定义了256256个子程序的入口地址个子程序的入口地址(段地址(段地址:偏移地址),试根据偏移地址),试根据ALAL中的值,决定调用中的值,决定调用256256个子程序中的哪一个。个子程序中的哪一个。 分分析析:每每个个子子程程序序的的入入口口地地址址占占用用4个个字字节节,需需将将AL的的值值乘乘以以4,再再加加上上入入口口地地址址表表首首的的偏偏移移地地址址,即即可可得到某子程序入口地址在表中的偏移地址;得到某子程序入口地址在表中的偏移地址; 将将该该地地

150、址址送送入入BX,利利用用段段间间间间接接调调用用指指令令实实现现子子程程序调用。序调用。 这这种种处处理理方方法法,类类似似于于第第5章章中中将将要要介介绍绍的的中中断断向向量量表的处理。表的处理。 即:即:BX=入口地址表首偏移地址入口地址表首偏移地址+AL*4DATA SEGMENT TABADD DD SUB0 ; 0#子程序入口地址子程序入口地址 DD SUB1 ;1#子程序入口地址子程序入口地址 DD SUB255 ; 255#子程序入口地址子程序入口地址DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100 DUP ( ? )STACK EN

151、DSCODE1 SEGMENT ;代码段;代码段CODE1实现查表转移实现查表转移 ASSUME CS: CODE1,DS:DATA,SS:STACK XOR AH,AH ; AH清清0 MOV CL,2 SHL AX,CL ; AX左移左移2次相当于乘以次相当于乘以4 MOV BX,OFFSET TABADD ; 取表首的偏移地址取表首的偏移地址 ADD BX,AX ; 加上加上AL*4 CALL DWORD PTR BX ; 段间间接调用子程序段间间接调用子程序 CODE1 ENDSCODE2 SEGMENT ;CODE2定义定义256个子程序(过程)个子程序(过程) ASSUME CS:

152、 CODE2 SUB0 PROC FAR RET SUB0 ENDP SUB1 PROC FAR RET SUB1 ENDP SUB255 PROC FAR RET SUB255 ENDPCODE2 ENDS一一段段程程序序有有时时重重复复执执行行多多次次,就就牵牵涉涉到循环程序结构,其组成部分为:到循环程序结构,其组成部分为:2. 循环体循环体即即要要求求重重复复执执行行的的程程序序段段部部分分,包包括括循环工作部分和循环控制部分。循环工作部分和循环控制部分。4.8.3 4.8.3 循环程序设计循环程序设计循环程序设计循环程序设计 1. 循环初始化循环初始化循循环环开开始始时时往往往往要要置

153、置初初态态,赋赋初初值值,包括循环工作部分初态和结束条件初态。包括循环工作部分初态和结束条件初态。3. 循环结束条件循环结束条件在循环程序中必须给出循环结束条件,否则就会进入死循环,结束条件有好多种,最常见的有:(1) 用计数器控制循环用计数器控制循环(2) 按问题的条件控制循环按问题的条件控制循环(3) 用开关量控制循环用开关量控制循环(4) 多重循环多重循环例例 分类统计字字数数组组ARRAY中正数、负数和零的个数,并分别存入内存字变量POST、NEGA和ZERO中,数组元素个数保存在数组的第一个字字中。分析:将字字变量量与0比较,然后判断是大于0(JG)、等于0(JE)还是小于0(JL)

154、,以分别对相应的计数器加1。 DATA SEGMENT ARRAY DW 8 ; 元素个数元素个数 DW 230 , -1437 , 26 , -31 , 0 , 3458 , 0 , 10 POST DW 0 NEGA DW 0 ZERO DW 0 DATA ENDS CODE SEGMENT ASSUME CS : CODE , DS : DATA START: MOV AX,DATA MOV DS,AX XOR AX,AX ; 用用AX作为正数的计数器作为正数的计数器 XOR BX,BX ; 用用BX作为负数的计数器作为负数的计数器 XOR DX,DX ; 用用DX作为零的计数器作为零的

155、计数器 MOV CX,ARRAY ;用;用CX来进行循环计数来进行循环计数 JCXZ DONE ;若数组的元素个数为若数组的元素个数为0,则转出,则转出 LEA DI,ARRAY+2 ;用指针;用指针DI来访问整个数组来访问整个数组 AGAIN: CMP WORD PTRDI,0 ;与;与0做比较做比较 JG HIGH ;大于;大于0,为正数,为正数 JE EQUAL ;等于;等于0,则转移,则转移 INC BX ;小于;小于0,为负数,负数个数增,为负数,负数个数增1 JMP NEXT HIGH: INC AX ;正数个数增;正数个数增1 JMP NEXT EQUAL: INC DX ;0的

156、个数增的个数增1 NEXT: INC DI INC DI LOOP AGAIN DONE: MOV POST,AX ; 把把各各类类的的统统计计数数保保存存到到内内存存单单元元中中 MOV NEGA,BX MOV ZERO,DX MOV AX,4C00H ; 结束程序,返回结束程序,返回DOS INT 21H CODE ENDS END START 例例统计字字变变量量VAL中0和1的个数,并将统计结果分别送字单元X和Y中。算法:依次将最高位移入CF中进行测试;若为0,则X单元加1;若为1,则Y单元加1。一个字有16位,故有16次循环。程序段如下:程序段如下: MOV CX,16 ; 16次循

157、环次循环 MOV SI,0 ; SI中存放中存放0的个数的个数 MOV DI,0 ; DI中存放中存放1的个数的个数 MOV AX,VAL AGAIN: SHL AX, 1 JC NOZERO ; 为为1,转走,转走 INC SI ; 为为0,SI加加1 JMP NEXTNOZERO: INC DI ; 为为1,DI加加1 NEXT: LOOP AGAIN MOV X,SI MOV Y,DI对上述程序做适当的改造:若根据某位为0或是1来决定调用不同的过程,便可得到一种逻辑尺技术逻辑尺技术程序设计方法;例:若10个数据已存放到BUF缓冲区,要求对其中的第3、4、6、8、9个数作FUN1(过程)处

158、理,其余的作FUN2(过程)处理;为此,可设置一个与数据处理相对应的位串,对作FUN1处理的位记为0,作FUN2处理的位记为1。位串从高位至低位排列,则实现上述控制要求的位串为:1100,1010,0100,0000;此位串称为逻辑尺逻辑尺,可放在某一寄存器中。如果逻辑尺中有10个有效位,则循环次数为10。于是可将上述程序中的指令作如下修改修改:MOV CX,16 改为:改为: MOV CX,10 INC SI 改为:改为: CALL FUN1 INC DI 改为:改为: CALL FUN2得到完整的应用逻辑尺技术的控制程序段如下:START:MOVCX,10;10次循环次循环MOVAX,0C

159、A40H;逻辑尺为逻辑尺为1100,1010,0100,0000AGAIN:SHLAX,1;AX左移一位,左移一位,0AX0,;AX15CFJCNOZERO;为为1,转移,转移CALLFUN1;为为0,调用,调用FUN1子程序子程序JMP NEXTNOZERO:CALLFUN2;为为1,调用,调用FUN2子程序子程序NEXT:LOOPAGAIN4.8.4 4.8.4 子程序设计子程序设计子程序设计子程序设计 子程序是程序设计中经常使用的子程序是程序设计中经常使用的程序结构程序结构; 通过把一些固定的、经常使用的功能做成子通过把一些固定的、经常使用的功能做成子程序的程序的形式形式,可以使源程序及

160、目标程序大大缩短,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。提高程序设计的效率和可靠性。 主程序与子程序之间参数传递的主程序与子程序之间参数传递的三种方法:三种方法:利用寄存器寄存器。这是一种最常见方法,把所需传递的参数直接直接放在CPU的寄存器中传递给子程序。利用存储单元存储单元。主程序把参数放在公共存储公共存储单元单元,子程序则从公共存储单元取得参数。利用堆栈堆栈。主程序将参数压入压入堆栈,子程序运行时则从堆栈中取出取出参数。例例:编编写写一一个个将将单单字字节节的的二二进进制制数数转转换换成成BCD码码数数的的程程序序,再再将将对对应应的的十十进进制制数数位位转转换换成

161、成ASCII码码字字符符串串,在在显显示示器上器上显示显示出来。出来。 算算法法分分析析:设设单单字字节节二二进进制制数数存存放放在在NUMBINNUMBIN单单元元,可可利用除法实现转换。利用除法实现转换。第一步第一步,将该数,将该数除以除以100100,商即为,商即为BCDBCD码的码的百位百位数;数;第第二二步步,将将第第一一步步所所得得余余数数除除以以1010,商商即即为为BCDBCD码码的的十十位位数,余数即为数,余数即为BCDBCD码的码的个位个位数。数。第第三三步步,将将BCDBCD码码数数的的百百位位、十十位位和和个个位位分分别别加加上上30H30H,即得到对应的即得到对应的A

162、SCIIASCII码。码。第第四四步步,将将ASCIIASCII码码字字符符串串存存入入一一个个缓缓冲冲区区,然然后后调调用用DOSDOS功能调用功能调用INT 21HINT 21H的的09H09H号功能,即可显示该字符串号功能,即可显示该字符串。DATA SEGMENT NUMBIN DB 0E7H ; 待转换的单字节二进制数待转换的单字节二进制数 STRING DB 10 DUP(20H) ; 定义显示缓冲区定义显示缓冲区 DB 0DH , 0AH ; 定义回车换行符定义回车换行符 DB $ ; 定义结束符定义结束符DATA ENDSSTACK SEGMENT PARA STACK STA

163、CK DB 100 DUP ( ? )STACK ENDSBCDTOASC PROC ; BCD码到码到ASCII码码转换子程序转换子程序 ADD AL, 30H MOV DI, AL ; 保存保存ASCII字符字符 INC DI ; 指向下一个单元指向下一个单元 RET BCDTOASC ENDP DISPASC PROC ; 显示子程序显示子程序 LEA DX,STRING MOV AH,09H INT 21H RET DISPASC ENDP CODE ENDS END BEGINCODE SEGMENT ASSUME CS : CODE , DS : DATA , SS : STACK

164、 START PROC FARBEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS, AX ;置段寄存器初值;置段寄存器初值 LEA DI,STRING XOR AH,AH ;AH清零清零 MOV AL,NUMBIN MOV BL,100D DIV BL ;AXBLAL,余数,余数AH CALL BCDTOASC ;调用转换程序,并保存结果;调用转换程序,并保存结果 ;入口参数入口参数:AL=BCD数数 MOV AL,AH ; 取余数送取余数送AL,十位数,十位数 XOR AH,AH MOV BL,10D DIV BL CALL BCDTOASC

165、 MOV AL,AH ;个位数;个位数 CALL BCDTOASC CALL DISPASC ; 调用调用显示显示程序程序 RET START ENDP 例例:利利用用堆堆栈栈传传递递被被加加数数和和加加数数,在在子子程程序序中中完完成成两两个个3232位位无无符符号号数数的的相相加加,要要求求返返回回结果置于结果置于DX:AXDX:AX中中。DATA SEGMENT NUM1 DD 01234567H ; 定义第一个定义第一个32位数,存放顺序:位数,存放顺序: ; 67H ,45H , 23H , 01H NUM2 DD 89ABCDEFH ; 定义第二个定义第二个32位数,存放顺序:位数

166、,存放顺序: ;0EFH , 0CDH , 0ABH , 89H RESULT DD ( ? ) ; 定义结果单元定义结果单元DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100 DUP ( ? )STACK ENDSCODE SEGMENT ASSUME CS : CODE , DS : DATA , SS : STACKSTART PROC FAR BEGIN: PUSH DS MOV AX , 0 PUSH AX MOV AX , DATA MOV DS , AX MOV BX,OFFSET NUM1 MOV AX,BX ; 取第一个数的取第一个数

167、的低字低字(4567H) PUSH AX ; 压入堆栈压入堆栈 MOV AX,BX+2 ; 取第一个数的取第一个数的高字高字(0123H) PUSH AX MOV AX,BX+4 ; 取取第二个数的低字第二个数的低字(0CDEFH) PUSH AX MOV AX,BX+6 ; 取取第二个数的高字第二个数的高字(89ABH) PUSH AX CALL ADDPROC ; 调用加法子程序调用加法子程序 MOV BX,OFFSET RESULT ; 保存结果保存结果 MOV BX,AX MOV BX+2,DX RET START ENDPADDPROC PROC ; 32位无符号数加法子程序位无符号

168、数加法子程序 PUSH BP ; 保护保护BP MOV BP , SP ; 将将当前的堆栈指针当前的堆栈指针SP送送BP MOV AX , BP+10 ; 取第一个数的低字取第一个数的低字 MOV DX , BP+8 ; 取第一个数的高字取第一个数的高字 ADD AX , BP+6 ; 与第二个数的低字相加与第二个数的低字相加 ADC DX , BP+4 ;与与第第二二个个数数的的高高字字相相加加,并并考考虑虑低低 ;字相加的进位;字相加的进位 POP BP ; 恢复恢复BP RET 8 ; 返回返回 ,并使,并使SP再加再加 8 ,以,以丢弃丢弃堆栈中参数堆栈中参数 ADDPROC ENDP

169、CODE ENDS END BEGIN设设被被加加数数为为A,加加数数为为B,先先压压入入A的的低低字字,再再压压入入A的的高高字字;然然后后再再压压入入B的的低低字字和和高高字字。主主程程序序在在执执行行CALL指令之前的堆栈情况如下图(指令之前的堆栈情况如下图(a)所示所示. 进进入入子子程程序序时时,SP已已减减2,并并已已将将CALL指指令令的的下下一一条条指指令令的的返返回回地地址址压压入入栈栈(因因是是近近调调用用,只只存存放放偏偏移地址移地址)。 执执行行PUSH BP指指令令之之后后,SP再再减减2。当当把把SP赋赋给给BP时时,BP指指向向了了堆堆栈栈的的栈栈顶顶,而而BP+

170、4则则指指向向了了参参数数区区,此此时时堆堆栈栈的的情情况况如如下下图图(b)所所示示。图图中中SP的的具具体体值与系统初始化情况有关。值与系统初始化情况有关。(a)CALL指令之前的堆栈SP指针指针堆栈区地址堆栈区地址堆栈区内容堆栈区内容 SPSS:005889ABHSS:005ACDEFHSS:005C0123HSS:005E4567H栈底栈底SS:0060/(b)执行PUSHBP指令之后的堆栈SP指针指针堆栈区地址堆栈区地址堆栈区内容堆栈区内容BP=SPSS:0054BP内容内容SS:0056返回地址返回地址BP+4SS:005889ABHBP+6SS:005ACDEFHBP+8SS:0

171、05C0123HBP+10SS:005E4567H栈底栈底SS:0060/ 例例1. 已知程序的数据段为:已知程序的数据段为:DATASEGMENTADB$,10HBDBCOMPUTERCDW1234H,0FFHDDB5DUP(?)EDD1200459AHDATAENDS求下列程序段执行后的结果是什么。MOVAL,AMOVDX,CXCHGDL,AMOVBX,OFFSETBMOVCX,3BXLEABX,DLDSSI,ELESDI,EMOVAL,AAL=24HMOVDX,CDX=1234HXCHGDL,ADL=24H,A=34HMOVBX,OFFSETBBX=2MOVCX,3BXCX=5550HL

172、EABX,DBX=000EHLDSSI,EDS=1200H,SI=459AHLESDI,EES=1200H,DI=459AH程序阅读题程序阅读题-例例2 : MOVCL,4MOVAX,2000HSHLAL,CLSHRAX,CLMOV2000H,AX试问:(试问:(1)若执行前)若执行前(2000H) = 05H,(2001H) = 07H, 则执行后有:则执行后有:(2000H) = H (2)本程序的功能是:)本程序的功能是:将将(2000H)、(2001H)单元中的非组合型单元中的非组合型BCD码压码压缩成组合型缩成组合型BCD码,并存放到码,并存放到(2000H)单元单元75H例例3 3

173、:某班有某班有7 个同学英语成绩低于个同学英语成绩低于80 分,分数存在分,分数存在ARRAY 数组中,数组中,试编程完成以下工作:试编程完成以下工作:(1)给每人加)给每人加 5 分,结果存到分,结果存到 NEW 数组中数组中(2)把总分存到)把总分存到SUM 单元中单元中DATA SEGMENTARRAY DB ?,?,?,?,?,?,?,?,?,?,?,?,?NEW DB 7 DUP(?)SUM DW 0DATA ENDSCODE SEGMENTMOV AX,DATAMOV DS, AXLEA SI,ARRAYLEA DI,NEWMOV CX,7NEXT: MOV AL,SIADD AL, 5MOV DI, ALINC SIINC DILOOP NEXTCODE ENDSCODE SEGMENTLEA SI,ARRAYCLCMOV CX, 7NEXT1: MOV AL,SIMOV AH, 0ADC SUM, AXINC SILOOP NEXT1CODE ENDS作业:作业: 4.24.194.34.204.54.224.64.234.74.254.26

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号