
第04章80868088汇编语言程序设计1.ppt
53页4.1 程序设计语言概述程序设计语言概述汇编语言程序的上机与处理过程汇编语言程序的上机与处理过程汇编语言程序的上机与处理过程汇编语言程序的上机与处理过程编辑程序Prog.asm文件汇编程序Prog.obj文件连接程序Prog.exe文件Edit.exeMasm.exeLink.exe2 24.2 8086/8088汇编语言的基本语法汇编语言的基本语法引例:引例:引例:引例:求从求从求从求从1 1 1 1开始连续开始连续开始连续开始连续50505050个奇数之和个奇数之和个奇数之和个奇数之和, , , ,并将结果并将结果并将结果并将结果存放在名字为存放在名字为存放在名字为存放在名字为SUMSUMSUMSUM的字存储单元中的字存储单元中的字存储单元中的字存储单元中DATASEGMENT; ;定义数据段定义数据段,DATA,DATA为段名为段名SUMDW 0; ;由符号由符号( (叫变量名叫变量名)SUM)SUM指定的内存单指定的内存单元类型定义为一个字元类型定义为一个字, ,初值为初值为0 0DATAENDS; ;定义数据段结束定义数据段结束STACKSEGMENT STACK; ;定义堆栈段定义堆栈段, ,这是组合类型伪指令这是组合类型伪指令, ,它规它规 定在伪指令后须跟定在伪指令后须跟STACKSTACK类型名类型名DB 200 DUP(0); ;定义堆栈段为定义堆栈段为200200个字节的连续存储个字节的连续存储区区, , 且每个字节的值为且每个字节的值为0 0STACKENDS; ;定义堆栈段结束定义堆栈段结束3 3CODESEGMENT; ;定义代码段定义代码段ASSUME::DS:DATA,SS:STACK,CS:CODE; ;由由ASSUMASSUM伪指令定义各段寄存器的内伪指令定义各段寄存器的内容容START: MOV AX,DATA ; ;将将DSDS初始化为数据段首址初始化为数据段首址 MOV DS,AX的段值的段值DATADATA MOV CX,50 ;CX;CX置入循置入循环计数数值 MOV AX,0 ; ;清清AXAX累加器累加器 MOV BX,1 ;BX;BX置常量置常量1 1NEXT: ADD AX,BX ; ;累加奇数和累加奇数和, ,计5050次次 INC BX ; ;求下一个奇数求下一个奇数 INC BX DEC CX ; ;循循环计数器作减数器作减1 1计数数 JNE NEXT ; ;未未计完完5050次次时, ,转至至NEXTNEXT循循环 MOV SUM,AX ; ;累加和送存累加和送存SUMSUM单元元 MOV AH,4CH ;DOS;DOS功能调用语句功能调用语句, ,机器将结束本机器将结束本 INT 21H程序的运行程序的运行, ,并返回并返回DOSDOS状态状态CODEENDS ; ;代码段结束代码段结束 END START ; ;整个程序整个程序汇编结束束 4 4汇编源程序一般由若干段组成汇编源程序一般由若干段组成汇编源程序一般由若干段组成汇编源程序一般由若干段组成, , , ,每个段都有一个名字每个段都有一个名字每个段都有一个名字每个段都有一个名字( ( ( (叫段名叫段名叫段名叫段名),),),),以以以以SEGMENTSEGMENTSEGMENTSEGMENT作为段的开始作为段的开始作为段的开始作为段的开始, , , ,以以以以ENDSENDSENDSENDS作为段的作为段的作为段的作为段的结束结束结束结束, , , ,这两者这两者这两者这两者( ( ( (伪指令伪指令伪指令伪指令) ) ) )前面都要冠以相同的名字。
前面都要冠以相同的名字前面都要冠以相同的名字前面都要冠以相同的名字段可以从性质上分为代码段、堆栈段、数据段和附加段可以从性质上分为代码段、堆栈段、数据段和附加段可以从性质上分为代码段、堆栈段、数据段和附加段可以从性质上分为代码段、堆栈段、数据段和附加段段段段4 4 4 4种Ø代码段是不可少的代码段是不可少的代码段是不可少的代码段是不可少的, , , ,堆栈段、数据段与附加段可根堆栈段、数据段与附加段可根堆栈段、数据段与附加段可根堆栈段、数据段与附加段可根据需要设置据需要设置据需要设置据需要设置代码段部分开始要设置段寄存器,代码段部分开始要设置段寄存器,代码段部分开始要设置段寄存器,代码段部分开始要设置段寄存器,要加载要加载要加载要加载DSDS内容 在上面这个例子中在上面这个例子中在上面这个例子中在上面这个例子中, , , ,一共定义了一共定义了一共定义了一共定义了3 3 3 3个段个段个段个段: : : : 1 1 1 1个数据段个数据段个数据段个数据段1 1 1 1个堆栈段个堆栈段个堆栈段个堆栈段1 1 1 1个代码段个代码段个代码段个代码段5 5 ( ( ( (一一一一) ) ) )汇编语言语句的种类和格式汇编语言语句的种类和格式汇编语言语句的种类和格式汇编语言语句的种类和格式1.1.1.1.语句的种类语句的种类语句的种类语句的种类 在在在在8086/80888086/80888086/80888086/8088汇编语言中汇编语言中汇编语言中汇编语言中, , , ,有有有有3 3 3 3种基本语句:种基本语句:种基本语句:种基本语句: 指令语句指令语句指令语句指令语句 伪指令语句伪指令语句伪指令语句伪指令语句 宏指令语句宏指令语句宏指令语句宏指令语句 ((((1 1 1 1)指令语句:)指令语句:)指令语句:)指令语句:是一种执行性语句是一种执行性语句是一种执行性语句是一种执行性语句, , , ,它在汇编时它在汇编时它在汇编时它在汇编时, , , ,汇汇汇汇编程序将为之产生一一对应的机器目标代码。
编程序将为之产生一一对应的机器目标代码编程序将为之产生一一对应的机器目标代码编程序将为之产生一一对应的机器目标代码 例:例:例:例: 汇编指令汇编指令汇编指令汇编指令 机器码机器码机器码机器码 MOV DS,AX 8E D8 ADD AX,BX 03 C37 7((2))伪指令语句:伪指令语句:伪指令语句:伪指令语句:是一种说明性语句,它在汇编时是一种说明性语句,它在汇编时是一种说明性语句,它在汇编时是一种说明性语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,如只为汇编程序提供进行汇编所需要的有关信息,如只为汇编程序提供进行汇编所需要的有关信息,如只为汇编程序提供进行汇编所需要的有关信息,如定义符号,分配存储单元,初始化存储器等,而本定义符号,分配存储单元,初始化存储器等,而本定义符号,分配存储单元,初始化存储器等,而本定义符号,分配存储单元,初始化存储器等,而本身并不代表生成目标代码。
身并不代表生成目标代码身并不代表生成目标代码身并不代表生成目标代码 例:例:例:例: DATA SEGMENTDATA SEGMENT AA DW 20H,-30H AA DW 20H,-30H DATA ENDS DATA ENDS((((3 3)宏指令:)宏指令:)宏指令:)宏指令:是以某个宏名字定义的一段指令序列,是以某个宏名字定义的一段指令序列,是以某个宏名字定义的一段指令序列,是以某个宏名字定义的一段指令序列,在汇编时,凡有宏指令出现的地方都将用相应的指在汇编时,凡有宏指令出现的地方都将用相应的指在汇编时,凡有宏指令出现的地方都将用相应的指在汇编时,凡有宏指令出现的地方都将用相应的指令序列的目标代码插入令序列的目标代码插入令序列的目标代码插入令序列的目标代码插入 宏指令语句是一般性指令语句的扩展宏指令语句是一般性指令语句的扩展。
宏指令语句是一般性指令语句的扩展宏指令语句是一般性指令语句的扩展8 81.1.1.1.指令语句指令语句指令语句指令语句指令语句的格式指令语句的格式指令语句的格式指令语句的格式[标号[标号[标号[标号: : : :][前缀]指令助记符[操作数表][][前缀]指令助记符[操作数表][][前缀]指令助记符[操作数表][][前缀]指令助记符[操作数表][; ; ; ;注释注释注释注释]]]]1)1)标号标号标号标号 标号代表标号代表标号代表标号代表“ “:”:”后面的指令所在的存储地址(这里后面的指令所在的存储地址(这里后面的指令所在的存储地址(这里后面的指令所在的存储地址(这里是逻辑地址)是逻辑地址)是逻辑地址)是逻辑地址), ,供供供供JMPJMP、、、、CALLCALL和和和和LOOPLOOP等指令作操作等指令作操作等指令作操作等指令作操作数使用数使用数使用数使用, ,以寻找转移目标地址以寻找转移目标地址以寻找转移目标地址以寻找转移目标地址2 2语句格语句格语句格语句格式式式式9 9 2)2)2)2)前缀前缀前缀前缀 8086/80888086/80888086/80888086/8088中有些特殊指令中有些特殊指令中有些特殊指令中有些特殊指令, , , ,它们常作为前缀同其它们常作为前缀同其它们常作为前缀同其它们常作为前缀同其他指令配合使用他指令配合使用他指令配合使用他指令配合使用, , , ,例如和例如和例如和例如和““““串操作指令串操作指令串操作指令串操作指令””””连用的连用的连用的连用的5 5 5 5条条条条““““重复指令重复指令重复指令重复指令””””(REP(REP(REP(REP、、、、REPE/REPZREPE/REPZREPE/REPZREPE/REPZ、、、、REPNE/REPNZ), REPNE/REPNZ), REPNE/REPNZ), REPNE/REPNZ), 以及总以及总以及总以及总线封锁指令线封锁指令线封锁指令线封锁指令LOOKLOOKLOOKLOOK等等等等3)3)3)3)指令助记符指令助记符指令助记符指令助记符 4)4)4)4)操作数表操作数表操作数表操作数表 操作数表可以是一个或两个操作数操作数表可以是一个或两个操作数操作数表可以是一个或两个操作数操作数表可以是一个或两个操作数; ; ; ;对宏指令来说对宏指令来说对宏指令来说对宏指令来说, , , ,可能有多个操作数。
操作数之间用逗号分隔可能有多个操作数操作数之间用逗号分隔可能有多个操作数操作数之间用逗号分隔可能有多个操作数操作数之间用逗号分隔5)5)5)5)注释注释注释注释 以以以以““““;;;;””””开始开始开始开始, , , ,用来简要说明该指令在程序中的作用用来简要说明该指令在程序中的作用用来简要说明该指令在程序中的作用用来简要说明该指令在程序中的作用1010伪指令语句的格式伪指令语句的格式伪指令语句的格式伪指令语句的格式 [名字]伪指令[参数表][;注释][名字]伪指令[参数表][;注释][名字]伪指令[参数表][;注释][名字]伪指令[参数表][;注释]2.2.2.2.伪指令语句伪指令语句伪指令语句伪指令语句11111)1)1)1)标号的属性标号的属性标号的属性标号的属性标号表示指令地址标号表示指令地址标号表示指令地址标号表示指令地址, , , ,是指令的符号地址是指令的符号地址是指令的符号地址是指令的符号地址, , , ,它具有它具有它具有它具有3 3 3 3种属性种属性种属性种属性————————段地段地段地段地址址址址、、、、段内偏移量段内偏移量段内偏移量段内偏移量( ( ( (或相对地址或相对地址或相对地址或相对地址) ) ) )以及以及以及以及类型类型类型类型。
段值(段值(SEG):标号所在段的起始地址):标号所在段的起始地址 偏移量(偏移量(OFFSET):段起点距离标号所指存储单元位置的字节数):段起点距离标号所指存储单元位置的字节数 类型(类型(TYPE):): NEAR ,, FAR2)在指令的助记符之前,使用标号并紧跟一个冒号2)在指令的助记符之前,使用标号并紧跟一个冒号2)在指令的助记符之前,使用标号并紧跟一个冒号2)在指令的助记符之前,使用标号并紧跟一个冒号““““::::””””,,,, 表示该标号被定义为一个类型为NEAR的标号表示该标号被定义为一个类型为NEAR的标号表示该标号被定义为一个类型为NEAR的标号表示该标号被定义为一个类型为NEAR的标号 当然当然当然当然, , , ,标号也可单列一行标号也可单列一行标号也可单列一行标号也可单列一行 例如例如例如例如: : : : subroutsubroutsubroutsubrout: : : : movmovmovmov ax,3000h ax,3000h ax,3000h ax,3000h3 3 3 3))))使用过程定义,为过程取的名字也是一个标号使用过程定义,为过程取的名字也是一个标号使用过程定义,为过程取的名字也是一个标号使用过程定义,为过程取的名字也是一个标号 Right PROC NEARRight PROC NEARRight PROC NEARRight PROC NEAR Right ENDP Right ENDP Right ENDP Right ENDP4) 4) 4) 4) 通常,通常,通常,通常,““““标号标号标号标号””””只在循环、转移和调用指令中使用。
只在循环、转移和调用指令中使用只在循环、转移和调用指令中使用只在循环、转移和调用指令中使用1.1.1.1.标号标号标号标号( (二二二二) )指令语句指令语句指令语句指令语句1212 表达式是操作数的一种,由常量、变量、标号、表达式是操作数的一种,由常量、变量、标号、表达式是操作数的一种,由常量、变量、标号、表达式是操作数的一种,由常量、变量、标号、寄存器与相关运算符组成,包括数值表达式和地寄存器与相关运算符组成,包括数值表达式和地寄存器与相关运算符组成,包括数值表达式和地寄存器与相关运算符组成,包括数值表达式和地址表达式址表达式址表达式址表达式它的求值是由汇编程序完成的它的求值是由汇编程序完成的它的求值是由汇编程序完成的它的求值是由汇编程序完成的2.2.2.2.指令助记符指令助记符指令助记符指令助记符3.3.3.3.操作数操作数操作数操作数4.4.4.4.表达式表达式表达式表达式1313(1)常量是指那些在汇编过程中已经有(1)常量是指那些在汇编过程中已经有(1)常量是指那些在汇编过程中已经有(1)常量是指那些在汇编过程中已经有确定数值确定数值确定数值确定数值的量,分的量,分的量,分的量,分““““数值常量数值常量数值常量数值常量““““与与与与““““符号常量符号常量符号常量符号常量””””两种两种两种两种(2)符号常量的定义需用伪操作命令(伪指令)(2)符号常量的定义需用伪操作命令(伪指令)(2)符号常量的定义需用伪操作命令(伪指令)(2)符号常量的定义需用伪操作命令(伪指令)““““EQUEQUEQUEQU””””或或或或““““====””””((((3 3 3 3)一个能被计算并产生数值的表达式称为数值表达式)一个能被计算并产生数值的表达式称为数值表达式)一个能被计算并产生数值的表达式称为数值表达式)一个能被计算并产生数值的表达式称为数值表达式 一个数值表达式可由常量、字符串常量以及代表常量或串一个数值表达式可由常量、字符串常量以及代表常量或串一个数值表达式可由常量、字符串常量以及代表常量或串一个数值表达式可由常量、字符串常量以及代表常量或串常量的名字等以常量的名字等以常量的名字等以常量的名字等以算术算术算术算术、、、、逻辑逻辑逻辑逻辑和和和和关系运算符关系运算符关系运算符关系运算符连接而成。
连接而成连接而成连接而成1 1 1 1)常量与数值表达式)常量与数值表达式)常量与数值表达式)常量与数值表达式1414例例例例1 1 1 1:ONE :ONE :ONE :ONE EQU 1EQU 1EQU 1EQU 1 DATA1=2DATA1=2DATA1=2DATA1=2* * * *12H12H12H12H MOV AX,DATA1+ONEMOV AX,DATA1+ONEMOV AX,DATA1+ONEMOV AX,DATA1+ONE即把25H送AX即把25H送AX即把25H送AX即把25H送AX例例例例2 2 2 2::::AND AX, ((NUMB LT 5)AND 30) OR ((NMB GE 5) AND 20)AND AX, ((NUMB LT 5)AND 30) OR ((NMB GE 5) AND 20)AND AX, ((NUMB LT 5)AND 30) OR ((NMB GE 5) AND 20)AND AX, ((NUMB LT 5)AND 30) OR ((NMB GE 5) AND 20)当当当当NUMBNUMBNUMBNUMB<5<5<5<5时,指令含意为AND AX,30时,指令含意为AND AX,30时,指令含意为AND AX,30时,指令含意为AND AX,30; ; ; ;当当当当NUMB≥NUMB≥NUMB≥NUMB≥5555时,指令含意为AND AX,20。
时,指令含意为AND AX,20时,指令含意为AND AX,20时,指令含意为AND AX,20ØØ此例中,操作符AND与操作数表达式中的AND具有不同此例中,操作符AND与操作数表达式中的AND具有不同此例中,操作符AND与操作数表达式中的AND具有不同此例中,操作符AND与操作数表达式中的AND具有不同的含意,的含意,的含意,的含意,前者是助记符,后者是伪运算前者是助记符,后者是伪运算前者是助记符,后者是伪运算前者是助记符,后者是伪运算1515((((1 1 1 1)变量)变量)变量)变量ØØ 变量是内存中的一个数据区的名字,即变量是内存中的一个数据区的名字,即变量是内存中的一个数据区的名字,即变量是内存中的一个数据区的名字,即数据所存放数据所存放数据所存放数据所存放地址的符号地址地址的符号地址地址的符号地址地址的符号地址一方面代表所表示的值,另一方面代一方面代表所表示的值,另一方面代一方面代表所表示的值,另一方面代一方面代表所表示的值,另一方面代表相应存储空间地址它可以作为指令中的存储器操作表相应存储空间地址它可以作为指令中的存储器操作表相应存储空间地址它可以作为指令中的存储器操作表相应存储空间地址。
它可以作为指令中的存储器操作数,直接寻址数,直接寻址数,直接寻址数,直接寻址ØØ 变量一般都是在数据段或附加段中使用伪指令(即变量一般都是在数据段或附加段中使用伪指令(即变量一般都是在数据段或附加段中使用伪指令(即变量一般都是在数据段或附加段中使用伪指令(即伪操作命令)伪操作命令)伪操作命令)伪操作命令)DBDBDBDB、、、、DWDWDWDW、、、、DDDDDDDD和和和和DT DT DT DT 来进行定义来进行定义来进行定义来进行定义 [变量名][变量名][变量名][变量名] 数据区定义伪指令数据区定义伪指令数据区定义伪指令数据区定义伪指令 表达式表达式表达式表达式ØØ变量具有段、偏移、类型三个属性变量具有段、偏移、类型三个属性变量具有段、偏移、类型三个属性变量具有段、偏移、类型三个属性2 2 2 2)变量与地址表达式)变量与地址表达式)变量与地址表达式)变量与地址表达式1616(1)(1)段属性:指该变量定义所在段的段地址,称为变量的段段属性:指该变量定义所在段的段地址,称为变量的段段属性:指该变量定义所在段的段地址,称为变量的段段属性:指该变量定义所在段的段地址,称为变量的段值。
值2)(2)偏移属性:指该变量定义所处位置至段地址的字节距离,偏移属性:指该变量定义所处位置至段地址的字节距离,偏移属性:指该变量定义所处位置至段地址的字节距离,偏移属性:指该变量定义所处位置至段地址的字节距离,称为变量的偏移值称为变量的偏移值称为变量的偏移值称为变量的偏移值3)(3)类型属性:指存取该变量所需字节数,可以是字节、字、类型属性:指存取该变量所需字节数,可以是字节、字、类型属性:指存取该变量所需字节数,可以是字节、字、类型属性:指存取该变量所需字节数,可以是字节、字、双字、四字和十字节之一双字、四字和十字节之一双字、四字和十字节之一双字、四字和十字节之一注意:注意:注意:注意:变量和标号的区别变量和标号的区别变量和标号的区别变量和标号的区别 1 1)变量是)变量是)变量是)变量是数据区数据区数据区数据区的名字,表示存储器操作数的地址;而标的名字,表示存储器操作数的地址;而标的名字,表示存储器操作数的地址;而标的名字,表示存储器操作数的地址;而标号是号是号是号是指令地址指令地址指令地址指令地址的符号表示的符号表示的符号表示的符号表示 2 2)变量的类型是数据项存取单位的)变量的类型是数据项存取单位的)变量的类型是数据项存取单位的)变量的类型是数据项存取单位的字节字节字节字节数大小;而标号的数大小;而标号的数大小;而标号的数大小;而标号的类型是类型是类型是类型是NEARNEAR和和和和FARFAR变量和常量的区别变量和常量的区别变量和常量的区别变量和常量的区别常量不占存储单元,而变量具有相应的存储空间。
常量不占存储单元,而变量具有相应的存储空间常量不占存储单元,而变量具有相应的存储空间常量不占存储单元,而变量具有相应的存储空间1717数值表达式:数值表达式:数值表达式:数值表达式:在汇编时产生一数值,仅具有大小而无其他在汇编时产生一数值,仅具有大小而无其他在汇编时产生一数值,仅具有大小而无其他在汇编时产生一数值,仅具有大小而无其他属性,可作为执行性指令中的立即操作数和数据区中的初属性,可作为执行性指令中的立即操作数和数据区中的初属性,可作为执行性指令中的立即操作数和数据区中的初属性,可作为执行性指令中的立即操作数和数据区中的初值使用地址表达式:地址表达式:地址表达式:地址表达式:由变量、常量、标号、寄存器的内容和相关由变量、常量、标号、寄存器的内容和相关由变量、常量、标号、寄存器的内容和相关由变量、常量、标号、寄存器的内容和相关运算符组成的有意义的式子它运算符组成的有意义的式子它运算符组成的有意义的式子它运算符组成的有意义的式子它表示存储器地址表示存储器地址表示存储器地址表示存储器地址,其值一,其值一,其值一,其值一般都是段内的偏移地址,因此它具有段属性、偏移值属性、般都是段内的偏移地址,因此它具有段属性、偏移值属性、般都是段内的偏移地址,因此它具有段属性、偏移值属性、般都是段内的偏移地址,因此它具有段属性、偏移值属性、类型属性。
地址表达式主要用来表示执行性指令中的多种类型属性地址表达式主要用来表示执行性指令中的多种类型属性地址表达式主要用来表示执行性指令中的多种类型属性地址表达式主要用来表示执行性指令中的多种形式的操作数形式的操作数形式的操作数形式的操作数 单个变量、标号、寄存器的内容是地址表达式的特单个变量、标号、寄存器的内容是地址表达式的特单个变量、标号、寄存器的内容是地址表达式的特单个变量、标号、寄存器的内容是地址表达式的特例在上一章中介绍的各种存储器寻址方式均属于简单的例在上一章中介绍的各种存储器寻址方式均属于简单的例在上一章中介绍的各种存储器寻址方式均属于简单的例在上一章中介绍的各种存储器寻址方式均属于简单的地址表达式地址表达式地址表达式地址表达式2 2 2 2)地址表达式)地址表达式)地址表达式)地址表达式1818段超越运算符:段超越运算符:段超越运算符:段超越运算符:用于临时给变量或地址表达式指定段属性用于临时给变量或地址表达式指定段属性用于临时给变量或地址表达式指定段属性用于临时给变量或地址表达式指定段属性格式:格式:格式:格式:段寄存器或段名:地址表达式段寄存器或段名:地址表达式段寄存器或段名:地址表达式段寄存器或段名:地址表达式属性指定操作属性指定操作属性指定操作属性指定操作PTRPTRPTRPTR用来明确指出或临时指定地址表达式的类型属性。
用来明确指出或临时指定地址表达式的类型属性用来明确指出或临时指定地址表达式的类型属性用来明确指出或临时指定地址表达式的类型属性格式:格式:格式:格式:数据类型数据类型数据类型数据类型 PTR PTR PTR PTR 地址表达式地址表达式地址表达式地址表达式数据类型可以是数据类型可以是数据类型可以是数据类型可以是BYTEBYTEBYTEBYTE、、、、WORDWORDWORDWORD、、、、DWORDDWORDDWORDDWORD、、、、NEARNEARNEARNEAR、、、、FARFARFARFAR等等等等1919例例例例: : : :ADD BYTE PTR ADD BYTE PTR ADD BYTE PTR ADD BYTE PTR [[[[DIDIDIDI]]]],23H,23H,23H,23H PRT PRT PRT PRT指定地址表达式[指定地址表达式[指定地址表达式[指定地址表达式[DIDIDIDI]]]]的类型为字节的类型为字节的类型为字节的类型为字节, , , ,此句表示将此句表示将此句表示将此句表示将23H23H23H23H与内存字节与内存字节与内存字节与内存字节单元[单元[单元[单元[DIDIDIDI]]]]中的字节数据相加中的字节数据相加中的字节数据相加中的字节数据相加, , , ,结果送回内存字节单元[结果送回内存字节单元[结果送回内存字节单元[结果送回内存字节单元[DIDIDIDI]。
]例例例例: : : :INC BYTE PTR ES:INC BYTE PTR ES:INC BYTE PTR ES:INC BYTE PTR ES:[[[[BP+3BP+3BP+3BP+3]]]]ES:ES:ES:ES:为跨段前缀为跨段前缀为跨段前缀为跨段前缀, , , ,冒号冒号冒号冒号““““:”:”:”:”前的前的前的前的ESESESES段寄存器指明了操段寄存器指明了操段寄存器指明了操段寄存器指明了操作数当前所在的段为附加数据段作数当前所在的段为附加数据段作数当前所在的段为附加数据段作数当前所在的段为附加数据段这时这时这时这时, , , ,操作数的物理地址将由操作数的物理地址将由操作数的物理地址将由操作数的物理地址将由ESESESES中的内容左移中的内容左移中的内容左移中的内容左移4 4 4 4位与偏位与偏位与偏位与偏移地址[移地址[移地址[移地址[BP+3BP+3BP+3BP+3]]]]相加而求得相加而求得相加而求得相加而求得此句表示将附加数据段中偏移地址为[此句表示将附加数据段中偏移地址为[此句表示将附加数据段中偏移地址为[此句表示将附加数据段中偏移地址为[BP+3BP+3BP+3BP+3]]]]的内存的内存的内存的内存单元中的数据单元中的数据单元中的数据单元中的数据加加加加1 1 1 1后仍保留在该单元中。
后仍保留在该单元中后仍保留在该单元中后仍保留在该单元中如果没有跨段前缀如果没有跨段前缀如果没有跨段前缀如果没有跨段前缀““““ES:”,ES:”,ES:”,ES:”,那么那么那么那么, , , ,由[由[由[由[BP+3BP+3BP+3BP+3]]]]地址表地址表地址表地址表达式所表示的偏移地址将被系统默认为是在堆栈段中达式所表示的偏移地址将被系统默认为是在堆栈段中达式所表示的偏移地址将被系统默认为是在堆栈段中达式所表示的偏移地址将被系统默认为是在堆栈段中20203 3 3 3)分析运算符)分析运算符)分析运算符)分析运算符 又叫取值运算符,可以获得变量、标号、过程名的段、又叫取值运算符,可以获得变量、标号、过程名的段、又叫取值运算符,可以获得变量、标号、过程名的段、又叫取值运算符,可以获得变量、标号、过程名的段、偏移及类型属性值包括偏移及类型属性值包括偏移及类型属性值包括偏移及类型属性值包括SEGSEGSEGSEG、、、、OFFSETOFFSETOFFSETOFFSET、、、、TYPETYPETYPETYPE、、、、SIZESIZESIZESIZE、、、、LENGTHLENGTHLENGTHLENGTH、、、、HIGHHIGHHIGHHIGH、、、、LOWLOWLOWLOW等。
等ØØSEGSEGSEGSEG:得到变量、标号、过程名等的段地址得到变量、标号、过程名等的段地址得到变量、标号、过程名等的段地址得到变量、标号、过程名等的段地址ØØOFFSETOFFSETOFFSETOFFSET:得到变量、标号、过程名等的移地址得到变量、标号、过程名等的移地址得到变量、标号、过程名等的移地址得到变量、标号、过程名等的移地址ØØTYPETYPETYPETYPE:得到变量、标号的类型得到变量、标号的类型得到变量、标号的类型得到变量、标号的类型ØØSIZESIZESIZESIZE:得到分配给变量的字节总数得到分配给变量的字节总数得到分配给变量的字节总数得到分配给变量的字节总数ØØLENGTHLENGTHLENGTHLENGTH:得到分配该变量的数据项数得到分配该变量的数据项数得到分配该变量的数据项数得到分配该变量的数据项数ØØHIGHHIGHHIGHHIGH:取地址表达式的高位字节取地址表达式的高位字节取地址表达式的高位字节取地址表达式的高位字节ØØLOWLOWLOWLOW:取地址表达式的低位字节取地址表达式的低位字节取地址表达式的低位字节取地址表达式的低位字节21211 1 1 1、数据定义伪指令、数据定义伪指令、数据定义伪指令、数据定义伪指令(三)伪指令语句(三)伪指令语句(三)伪指令语句(三)伪指令语句格式:格式:[ [变量名变量名] ] 助记符助记符 操作数列表操作数列表 [;[;注释注释] ] 变变量量名名::是是可可有有可可无无的的,,它它用用符符号号地地址址表表示示,,其其作作用用与与指指令令语语句句前前的的标标号号相相同同,,但但它它的的后后面面不不跟跟冒冒号号。
如如果果语语句句中中有有变变量量则则汇汇编编程程序序使使其其记记以以第第一一个个字字节节的的偏偏移地址 注释:注释:用来用来说明说明该伪操作的功能,它也是可有可无的该伪操作的功能,它也是可有可无的助记符:助记符:说明所用伪操作的助记符,常用的有以下几种:说明所用伪操作的助记符,常用的有以下几种:DB, DW, DQ, DD , DT22221)1)1)1)DBDBDBDB(定义字节)(定义字节)(定义字节)(定义字节)用于申请一个数据项为字节的数据区,需要时可以用数值表达式赋予初用于申请一个数据项为字节的数据区,需要时可以用数值表达式赋予初用于申请一个数据项为字节的数据区,需要时可以用数值表达式赋予初用于申请一个数据项为字节的数据区,需要时可以用数值表达式赋予初值如果该数据区定义作为一个变量,则变量类型是BYTE如果该数据区定义作为一个变量,则变量类型是BYTE如果该数据区定义作为一个变量,则变量类型是BYTE如果该数据区定义作为一个变量,则变量类型是BYTE2)2)2)2)DWDWDWDW(定义字)(定义字)(定义字)(定义字)数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变量类型是WORD。
量类型是WORD量类型是WORD量类型是WORD3)3)3)3)DDDDDDDD(定义双字)(定义双字)(定义双字)(定义双字)数据项为双字,允许用地址表达式为数据项赋初值(即段属性及偏移量数据项为双字,允许用地址表达式为数据项赋初值(即段属性及偏移量数据项为双字,允许用地址表达式为数据项赋初值(即段属性及偏移量数据项为双字,允许用地址表达式为数据项赋初值(即段属性及偏移量属性),变量类型为DWORD属性),变量类型为DWORD属性),变量类型为DWORD属性),变量类型为DWORD4)4)4)4)DQDQDQDQ(定义(定义(定义(定义4 4 4 4字)字)字)字)数据项为数据项为数据项为数据项为4 4 4 4字,变量类型字,变量类型字,变量类型字,变量类型为Q为Q为Q为QBYTEBYTEBYTEBYTE5)5)5)5)DTDTDTDT(定义(定义(定义(定义10101010字节)字节)字节)字节)数据项为数据项为数据项为数据项为10101010个字节,变量类型为TBYTE个字节,变量类型为TBYTE个字节,变量类型为TBYTE个字节,变量类型为TBYTE2323DSEGDSEGDSEGDSEG SEGMENTSEGMENTSEGMENTSEGMENTTABLETABLETABLETABLE DWDWDWDW 12121212 DWDWDWDW 34343434DATA1DATA1DATA1DATA1 DBDBDBDB 5555TABLE2TABLE2TABLE2TABLE2 DWDWDWDW 67676767 DWDWDWDW 89898989 DWDWDWDW 1011101110111011DATA2DATA2DATA2DATA2 DBDBDBDB 12121212RATESRATESRATESRATES DWDWDWDW 1314131413141314OTHRATOTHRATOTHRATOTHRAT DDDDDDDD 1718171817181718DSEGDSEGDSEGDSEG ENDSENDSENDSENDS2424““““DWDWDWDW 变量变量变量变量” ” ” ” 语句表示利用该变量的偏移量来初始化相语句表示利用该变量的偏移量来初始化相语句表示利用该变量的偏移量来初始化相语句表示利用该变量的偏移量来初始化相应的存储字;应的存储字;应的存储字;应的存储字;““““DDDDDDDD 变量变量变量变量””””语句表示利用该变量的段分语句表示利用该变量的段分语句表示利用该变量的段分语句表示利用该变量的段分量和偏移量来初始化相应的两个连续的存储字,低位字中量和偏移量来初始化相应的两个连续的存储字,低位字中量和偏移量来初始化相应的两个连续的存储字,低位字中量和偏移量来初始化相应的两个连续的存储字,低位字中是偏移量,高位字中是段分量。
是偏移量,高位字中是段分量是偏移量,高位字中是段分量是偏移量,高位字中是段分量DB、DW、DD可用于初始化存储器这些伪指令的DB、DW、DD可用于初始化存储器这些伪指令的DB、DW、DD可用于初始化存储器这些伪指令的DB、DW、DD可用于初始化存储器这些伪指令的右右右右边边边边有一表达式,表达式之值即该有一表达式,表达式之值即该有一表达式,表达式之值即该有一表达式,表达式之值即该存储存储存储存储““““单位单位单位单位””””的初值2525 FOOFOOFOOFOO SEGMENT SEGMENT SEGMENT SEGMENT ATATATAT 55H 55H 55H 55H ZEROZEROZEROZERO DB 0DB 0DB 0DB 0 ONEONEONEONE DW ONEDW ONEDW ONEDW ONE ;内容为0001H;内容为0001H;内容为0001H;内容为0001H TWOTWOTWOTWO DD TWODD TWODD TWODD TWO ;内容为00550003H;内容为00550003H;内容为00550003H;内容为00550003H ;即高位字为55H,低位字为3;即高位字为55H,低位字为3;即高位字为55H,低位字为3;即高位字为55H,低位字为3 FOURFOURFOURFOUR DW FOUR+5DW FOUR+5DW FOUR+5DW FOUR+5 ;内容为7+5=12;内容为7+5=12;内容为7+5=12;内容为7+5=12 SIX SIX SIX SIX DW ZERODW ZERODW ZERODW ZERO_ _TWOTWOTWOTWO ;内容为0-3=-3;内容为0-3=-3;内容为0-3=-3;内容为0-3=-3 ATE ATE ATE ATE DB 5DB 5DB 5DB 5* *6666 ;内容为30;内容为30;内容为30;内容为30 FOO FOO FOO FOO ENDSENDSENDSENDS26262727例例 操作数也可以是字符串,如:操作数也可以是字符串,如: MESSAGE DB MESSAGE DB ‘HELLOHELLO’则存储器存储情况如右图所示:则存储器存储情况如右图所示: 注意:注意:DB ’AB’和和DW ’AB’的存储的存储 分配空间的不同。
如下图:分配空间的不同如下图:2828例例 操操作作数数??可可以以保保留留存存储储空空间间,,但但不不存存入数据如:如:ABC DB 0,,?, ?, ?,,0 DEF DW ?, 52, ?经汇编后的存储情况如右图所示经汇编后的存储情况如右图所示 2929 操作数字段还可以使用复制操作符来复制某个(或某些)操作数其格式为操作数字段还可以使用复制操作符来复制某个(或某些)操作数其格式为:: repeat_count DUP(operate, operate,,…) 其中其中repeat_count可以是一个表达式,可以是一个表达式,它的值应该是一个正整数,用来指定括号它的值应该是一个正整数,用来指定括号中的操作数的重复次数中的操作数的重复次数 例例 ARRAYl DB 2 DUP(0,, 1,,2,?,?) ARRAY2 DB 100 DUP(??) 汇编后的存储情况如下图所示汇编后的存储情况如下图所示 ARRAYl DB 2 DUP(0,, 1,,2,?,?)和以下语句是等价的:和以下语句是等价的:ARRAYl DB 0,,I,,2,,?,,0,,1,,2,,? 3030 汇编语言中所有的变量名、标号名、过程名、指令汇编语言中所有的变量名、标号名、过程名、指令汇编语言中所有的变量名、标号名、过程名、指令汇编语言中所有的变量名、标号名、过程名、指令助记符、寄存器名等统称助记符、寄存器名等统称助记符、寄存器名等统称助记符、寄存器名等统称““““符号符号符号符号””””,这些符号可以通过,这些符号可以通过,这些符号可以通过,这些符号可以通过伪指令重新命名,也可以通过伪指令为其定义其他名字伪指令重新命名,也可以通过伪指令为其定义其他名字伪指令重新命名,也可以通过伪指令为其定义其他名字伪指令重新命名,也可以通过伪指令为其定义其他名字及新的类型属性。
及新的类型属性及新的类型属性及新的类型属性1 1 1 1)))) EQUEQUEQUEQU(赋值伪指令)(赋值伪指令)(赋值伪指令)(赋值伪指令) EQUEQUEQUEQU可以给表达式赋予一个名字,其后指令中凡需要可以给表达式赋予一个名字,其后指令中凡需要可以给表达式赋予一个名字,其后指令中凡需要可以给表达式赋予一个名字,其后指令中凡需要用到该表达式的均可以用这个名字代替不申请分配内用到该表达式的均可以用这个名字代替不申请分配内用到该表达式的均可以用这个名字代替不申请分配内用到该表达式的均可以用这个名字代替不申请分配内存 格式:格式:格式:格式: 符号名符号名符号名符号名 EQUEQUEQUEQU 表达式表达式表达式表达式2符号定义伪指令2符号定义伪指令2符号定义伪指令2符号定义伪指令3131(2)=(等号伪指令)(2)=(等号伪指令)(2)=(等号伪指令)(2)=(等号伪指令)格式:格式:格式:格式: 符号名符号名符号名符号名 = = = = 表达式表达式表达式表达式 它与EQU基本类似,起赋值作用,区别在于:它与EQU基本类似,起赋值作用,区别在于:它与EQU基本类似,起赋值作用,区别在于:它与EQU基本类似,起赋值作用,区别在于: 使用使用使用使用““““====””””定义的符号名可以被重新定义,使符定义的符号名可以被重新定义,使符定义的符号名可以被重新定义,使符定义的符号名可以被重新定义,使符号名具有新值。
号名具有新值号名具有新值号名具有新值 例:例: X=12X=12 ;先将;先将1212赋于符号名赋于符号名X X X=X+1X=X+1 ;将符号名;将符号名X X重新定义使其具有新值重新定义使其具有新值则在第则在第2 2个语句经过汇编后,最终X=13个语句经过汇编后,最终X=1332323 3 3 3、段定义伪指令、段定义伪指令、段定义伪指令、段定义伪指令段定义伪指令指示汇编程序应如何按段来组织程序和使用存段定义伪指令指示汇编程序应如何按段来组织程序和使用存段定义伪指令指示汇编程序应如何按段来组织程序和使用存段定义伪指令指示汇编程序应如何按段来组织程序和使用存储器所用命令主要有储器所用命令主要有储器所用命令主要有储器所用命令主要有SEGMENTSEGMENT,,,,ENDSENDS,,,,ASSUMEASSUME,,,,ORGORG等汇编源程序一般由若干段组成汇编源程序一般由若干段组成汇编源程序一般由若干段组成汇编源程序一般由若干段组成, , , , 以以以以SEGMENTSEGMENTSEGMENTSEGMENT作为段的开始作为段的开始作为段的开始作为段的开始, , , ,以以以以ENDSENDSENDSENDS作为段的结束作为段的结束作为段的结束作为段的结束, , , ,这两者这两者这两者这两者( ( ( (伪指令伪指令伪指令伪指令) ) ) )前面都要冠以相同的名字前面都要冠以相同的名字前面都要冠以相同的名字前面都要冠以相同的名字DATASEGMENTSUMDW 0DATAENDSSTACKSEGMENT STACKDB 200 DUP(0)STACKENDS3333段名段名段名段名 SEGMENTSEGMENTSEGMENTSEGMENT 一系列汇编指令一系列汇编指令一系列汇编指令一系列汇编指令段名段名段名段名 ENDSENDSENDSENDS((((1 1 1 1)))) SEGMENTSEGMENTSEGMENTSEGMENT和和和和ENDSENDSENDSENDS伪指令伪指令伪指令伪指令3434((((2 2 2 2)))) 设定段寄存器伪指令设定段寄存器伪指令设定段寄存器伪指令设定段寄存器伪指令ASASASASSUME SUME SUME SUME ASSUMEASSUME 段寄存器名段寄存器名段寄存器名段寄存器名: :段名段名段名段名[ [,段寄存器名,段寄存器名,段寄存器名,段寄存器名: :段名段名段名段名[ [,,,,...]]...]]ØØ告诉汇编程序用告诉汇编程序用告诉汇编程序用告诉汇编程序用SEGMENTSEGMENTSEGMENTSEGMENT伪操作定义过的伪操作定义过的伪操作定义过的伪操作定义过的段段段段的的的的段地址段地址段地址段地址将要将要将要将要存放在哪个存放在哪个存放在哪个存放在哪个段寄存器段寄存器段寄存器段寄存器中。
中Ø 其中段寄存器名必须是其中段寄存器名必须是CSCS、、DSDS、、ESES和和SSSS中的一个,而段中的一个,而段名则必须是由名则必须是由segmentsegment定义的段中的段名定义的段中的段名CODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODE3535ORG伪指令用来指出其后的程序段或数据块ORG伪指令用来指出其后的程序段或数据块ORG伪指令用来指出其后的程序段或数据块ORG伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量存放的起始地址的偏移量存放的起始地址的偏移量存放的起始地址的偏移量其格式为:其格式为:其格式为:其格式为:ORGORGORGORG 表达式表达式表达式表达式汇编程序把语句中表达式之值作为起始地址汇编程序把语句中表达式之值作为起始地址汇编程序把语句中表达式之值作为起始地址汇编程序把语句中表达式之值作为起始地址, , , ,连续存放程序和数据,直到出现一个新的ORG连续存放程序和数据,直到出现一个新的ORG连续存放程序和数据,直到出现一个新的ORG连续存放程序和数据,直到出现一个新的ORG指令若省略ORG,则从本段起始地址开始连指令。
若省略ORG,则从本段起始地址开始连指令若省略ORG,则从本段起始地址开始连指令若省略ORG,则从本段起始地址开始连续存放3 3 3 3))))ORGORGORGORG伪指令伪指令伪指令伪指令3636((((1 1 1 1)过程定义伪指令格式:)过程定义伪指令格式:)过程定义伪指令格式:)过程定义伪指令格式:过程名过程名过程名过程名 PROCPROCPROCPROC 〔〔〔〔类型类型类型类型〕〕〕〕 … … … … ;指令序列;指令序列;指令序列;指令序列 过程名过程名过程名过程名 ENDPENDPENDPENDP((((2 2 2 2)调用过程)调用过程)调用过程)调用过程调用过程用调用过程用调用过程用调用过程用““““CALL过程名CALL过程名CALL过程名CALL过程名””””来实现4 4 4 4)过程返回)过程返回)过程返回)过程返回通常子程序中包括一至多条通常子程序中包括一至多条通常子程序中包括一至多条通常子程序中包括一至多条返回指令返回指令返回指令返回指令,即当过程运行,即当过程运行,即当过程运行,即当过程运行至某种条件满足时返回至主程序中调用指令的下一条指令至某种条件满足时返回至主程序中调用指令的下一条指令至某种条件满足时返回至主程序中调用指令的下一条指令至某种条件满足时返回至主程序中调用指令的下一条指令继续执行。
继续执行继续执行继续执行4 4 4 4、过程定义伪指令、过程定义伪指令、过程定义伪指令、过程定义伪指令3737一、顺序结构程序一、顺序结构程序 顺序结构是最基本、最常用的程序结构其特顺序结构是最基本、最常用的程序结构其特顺序结构是最基本、最常用的程序结构其特顺序结构是最基本、最常用的程序结构其特点是,完全按照程序指令编排的顺序依次执行点是,完全按照程序指令编排的顺序依次执行点是,完全按照程序指令编排的顺序依次执行点是,完全按照程序指令编排的顺序依次执行例:对两个8字节无符号数求和,这两个数分别用例:对两个8字节无符号数求和,这两个数分别用例:对两个8字节无符号数求和,这两个数分别用例:对两个8字节无符号数求和,这两个数分别用变量D1及D2表示将两数之和的最高位进位变量D1及D2表示将两数之和的最高位进位变量D1及D2表示将两数之和的最高位进位变量D1及D2表示将两数之和的最高位进位放在AL中,两数之和的其他位按从高到低顺序放在AL中,两数之和的其他位按从高到低顺序放在AL中,两数之和的其他位按从高到低顺序放在AL中,两数之和的其他位按从高到低顺序依次放在SI,BX,CX,DX中。
依次放在SI,BX,CX,DX中依次放在SI,BX,CX,DX中依次放在SI,BX,CX,DX中4.3 8086/80888086/8088汇编语言程序设计基本方法汇编语言程序设计基本方法3838 D SEGMENTD SEGMENT D1 DB D1 DB 12H,34H,56H,78H,12H,34H,56H,78H,9AH,0ABH,0BCH,0CDH9AH,0ABH,0BCH,0CDH D2 DB D2 DB 0CDH,0BCH,0ABH,0CDH,0BCH,0ABH,9AH,78H,56H,34H,12H9AH,78H,56H,34H,12H D ENDSD ENDS C SEGMENTC SEGMENT ASSUME CS:C,DS:D ASSUME CS:C,DS:D ; ;说明代码段、数据段说明代码段、数据段说明代码段、数据段说明代码段、数据段 BG:BG: MOV AX,D MOV AX,D MOV DS,AX MOV DS,AX ; ;给给给给DSDS赋段值赋段值赋段值赋段值 LEA DI,D1 LEA DI,D1 ; ; ; ;将将将将D1D1D1D1表示的偏移地址送表示的偏移地址送表示的偏移地址送表示的偏移地址送DIDIDIDI MOV DX, MOV DX, [DI] [DI] ; ; ; ;取第取第取第取第1 1 1 1操作数到寄存器中操作数到寄存器中操作数到寄存器中操作数到寄存器中 MOV CX, MOV CX, [DI+2][DI+2] MOV BX, MOV BX, [DI+4][DI+4] MOV SI, MOV SI, [DI+6][DI+6] LEA DI,D2 LEA DI,D2 ; ; ; ;将将将将D2D2D2D2表示的偏移地址送表示的偏移地址送表示的偏移地址送表示的偏移地址送DIDIDIDI ADD DX, ADD DX, [DI] [DI] ;将;将;将;将D1D1D1D1和和和和D2D2D2D2相加,结果存放在相加,结果存放在相加,结果存放在相加,结果存放在SISISISI、、、、BXBXBXBX、、、、CXCXCXCX、、、、DXDXDXDX中中中中 ADC CX, ADC CX, [DI+2][DI+2] ADC BX, ADC BX, [DI+4][DI+4] ADC SI, ADC SI, [DI+6][DI+6] MOV AL,0 MOV AL,0 ADC AL,0 ADC AL,0 MOV AH,4CH MOV AH,4CH INT 21H INT 21H C ENDSC ENDS END END BGBG 3939二、分支结构程序二、分支结构程序程序中按照所设置的逻辑条件,在判定当前程序中按照所设置的逻辑条件,在判定当前程序中按照所设置的逻辑条件,在判定当前程序中按照所设置的逻辑条件,在判定当前的状态标志位是否满足后,决定程序两个的状态标志位是否满足后,决定程序两个的状态标志位是否满足后,决定程序两个的状态标志位是否满足后,决定程序两个可能的出口:当满足条件时,后续程序将可能的出口:当满足条件时,后续程序将可能的出口:当满足条件时,后续程序将可能的出口:当满足条件时,后续程序将转向条件转移指令所指的转移地址;当条转向条件转移指令所指的转移地址;当条转向条件转移指令所指的转移地址;当条转向条件转移指令所指的转移地址;当条件布满足时,程序将继续顺序执行。
件布满足时,程序将继续顺序执行件布满足时,程序将继续顺序执行件布满足时,程序将继续顺序执行例:比较以存储器变量D1和D2表示的两例:比较以存储器变量D1和D2表示的两例:比较以存储器变量D1和D2表示的两例:比较以存储器变量D1和D2表示的两个个个个有符号有符号有符号有符号字数据的大小,将其中较大数据字数据的大小,将其中较大数据字数据的大小,将其中较大数据字数据的大小,将其中较大数据放在BX寄存器中放在BX寄存器中放在BX寄存器中放在BX寄存器中4040 DATA SEGMENTDATA SEGMENT D1 DW -123 ; D1 DW -123 ;补码为补码为补码为补码为FF85HFF85H D2 DW -120 ; D2 DW -120 ;补码为补码为补码为补码为FF88HFF88H DATA ENDSDATA ENDS CODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA ; ASSUME CS:CODE,DS:DATA ;说明代码段、数据段说明代码段、数据段说明代码段、数据段说明代码段、数据段 BEGIN: MOV AX,DATABEGIN: MOV AX,DATA MOV DS,AX ; MOV DS,AX ;给给给给DSDS赋段值赋段值赋段值赋段值 MOV BX,D1MOV BX,D1 CMP BX,D2 CMP BX,D2 JGE NEXT ; JGE NEXT ;若若若若D1≥D2D1≥D2,,,,则不交换,则不交换,则不交换,则不交换,转转转转NEXTNEXT MOV BX,D2 ; MOV BX,D2 ;若若若若D1 地操作,顺序执行后续程序指令地操作,顺序执行后续程序指令地操作,顺序执行后续程序指令例:找出从无符号字节数据存储变量VAR开始存例:找出从无符号字节数据存储变量VAR开始存例:找出从无符号字节数据存储变量VAR开始存例:找出从无符号字节数据存储变量VAR开始存放的N个数中的最大数放在BH中放的N个数中的最大数放在BH中放的N个数中的最大数放在BH中放的N个数中的最大数放在BH中. . DSEG SEGMENTDSEG SEGMENT ; ;定义数据段定义数据段定义数据段定义数据段 VAR DB 5,7,19H,23H,0A0HVAR DB 5,7,19H,23H,0A0H N EQU 5 N EQU 5 DSEG ENDSDSEG ENDS4242CSEG SEGMENTCSEG SEGMENT ASSUME CS: CSEG,DS:DSEG ; ASSUME CS: CSEG,DS:DSEG ;说明代码段、数据段说明代码段、数据段说明代码段、数据段说明代码段、数据段 BG: MOV AX,DSEGBG: MOV AX,DSEG MOV DS,AX ; MOV DS,AX ;给给给给DSDS赋段值赋段值赋段值赋段值 MOV CX,N-1 ;MOV CX,N-1 ;置循环控制数置循环控制数置循环控制数置循环控制数 MOV SI,0MOV SI,0 MOV BH,VAR[SI] ; MOV BH,VAR[SI] ;取第取第取第取第1 1字节数到字节数到字节数到字节数到BHBH JCXZ LAST ; JCXZ LAST ;如果如果如果如果CX=0CX=0则转则转则转则转 AGIN: INC SIAGIN: INC SI CMP BH,VAR[SI] CMP BH,VAR[SI] JAE NEXT ; JAE NEXT ;若若若若BHBH中已为较大的数,则转移中已为较大的数,则转移中已为较大的数,则转移中已为较大的数,则转移 MOV BH,VAR[SI] ;MOV BH,VAR[SI] ;改变改变改变改变BHBH的值,使其为较大的数的值,使其为较大的数的值,使其为较大的数的值,使其为较大的数 NEXT: LOOP AGIN ;CX←CX-1,NEXT: LOOP AGIN ;CX←CX-1,若若若若CXCX不等不等不等不等 于于于于0 0则转则转则转则转 LAST: MOV AH,4CHLAST: MOV AH,4CH INT 21H INT 21H CSEG ENDSCSEG ENDS END BG END BG 4343 所谓所谓所谓所谓DOSDOSDOSDOS及及及及BIOSBIOSBIOSBIOS中断调用,就是为了节省编程中断调用,就是为了节省编程中断调用,就是为了节省编程中断调用,就是为了节省编程工作量与优化程序结构,在工作量与优化程序结构,在工作量与优化程序结构,在工作量与优化程序结构,在DOSDOS及及及及BIOSBIOS中预先设中预先设中预先设中预先设计好了一系列的通用子程序,以便供计好了一系列的通用子程序,以便供计好了一系列的通用子程序,以便供计好了一系列的通用子程序,以便供DOSDOS及及及及BIOSBIOS调用。 调用 由于这种调用采用的是以中断指令由于这种调用采用的是以中断指令由于这种调用采用的是以中断指令由于这种调用采用的是以中断指令INT n INT n 的内的内的内的内部中断方式进行的,因此常称为部中断方式进行的,因此常称为部中断方式进行的,因此常称为部中断方式进行的,因此常称为DOSDOS及及及及BIOSBIOS中断中断中断中断调用;又因为在一个中断服务程序中往往包含多调用;又因为在一个中断服务程序中往往包含多调用;又因为在一个中断服务程序中往往包含多调用;又因为在一个中断服务程序中往往包含多个功能相对独立的子程序,所以也将中断调用称个功能相对独立的子程序,所以也将中断调用称个功能相对独立的子程序,所以也将中断调用称个功能相对独立的子程序,所以也将中断调用称为系统功能调用或功能调用或中断功能调用为系统功能调用或功能调用或中断功能调用为系统功能调用或功能调用或中断功能调用为系统功能调用或功能调用或中断功能调用四、四、DOS及及BIOS中断调用中断调用4444DOSDOSDOSDOS的的的的功能调用是指功能调用是指功能调用是指功能调用是指DOSDOSDOSDOS为系统程序员和用户提供的一为系统程序员和用户提供的一为系统程序员和用户提供的一为系统程序员和用户提供的一组常用子程序如何使用的问题组常用子程序如何使用的问题组常用子程序如何使用的问题组常用子程序如何使用的问题,,,,DOSDOSDOSDOS规定用规定用规定用规定用中断指令中断指令中断指令中断指令INT INT INT INT 21H21H21H21H进入各功能调用子程序的总入口进入各功能调用子程序的总入口进入各功能调用子程序的总入口进入各功能调用子程序的总入口 所有所有所有所有DOSDOSDOSDOS提供给用户的功能调用格式(包括提供给用户的功能调用格式(包括提供给用户的功能调用格式(包括提供给用户的功能调用格式(包括ROM-BIOSROM-BIOSROM-BIOSROM-BIOS调调调调用)都是一样的,一般分为用)都是一样的,一般分为用)都是一样的,一般分为用)都是一样的,一般分为4 4 4 4个步骤:个步骤:个步骤:个步骤:① ① ① ① 在在在在AHAHAHAH寄存器中设置系统功能调用号;寄存器中设置系统功能调用号;寄存器中设置系统功能调用号;寄存器中设置系统功能调用号;② ② ② ② 在指定的寄存器中设置中设置入口参数;在指定的寄存器中设置中设置入口参数;在指定的寄存器中设置中设置入口参数;在指定的寄存器中设置中设置入口参数;③ ③ ③ ③ 用用用用INT 21HINT 21HINT 21HINT 21H指令执行功能调用;指令执行功能调用;指令执行功能调用;指令执行功能调用;④ ④ ④ ④ 根据出口参数分析功能调用的执行情况。 根据出口参数分析功能调用的执行情况根据出口参数分析功能调用的执行情况根据出口参数分析功能调用的执行情况DOS常用功能调用举例DOS常用功能调用举例45451111返回DOS返回DOS返回DOS返回DOS 向量号向量号向量号向量号 21H21H21H21H 功能号功能号功能号功能号 4CH4CH4CH4CH该功能使系统结束程序运行后返回该功能使系统结束程序运行后返回该功能使系统结束程序运行后返回该功能使系统结束程序运行后返回DOSDOSDOSDOS状态例:例:例:例: MOV AH,4CHMOV AH,4CHMOV AH,4CHMOV AH,4CH INT 21HINT 21HINT 21HINT 21H2222. . . . 键盘输入并显示键盘输入并显示键盘输入并显示键盘输入并显示向量号向量号向量号向量号 21H21H21H21H功能号功能号功能号功能号 1111该功能从键盘输入一个字符,将其ASCII码保存在AL中,该功能从键盘输入一个字符,将其ASCII码保存在AL中,该功能从键盘输入一个字符,将其ASCII码保存在AL中,该功能从键盘输入一个字符,将其ASCII码保存在AL中,输入字符回显在输入字符回显在输入字符回显在输入字符回显在CRTCRTCRTCRT上。 上例:例:例:例: MOV AH,1MOV AH,1MOV AH,1MOV AH,1 INT 21HINT 21HINT 21HINT 21H中断返回时,输入字符的ASCII码被存放在AL中,该字符中断返回时,输入字符的ASCII码被存放在AL中,该字符中断返回时,输入字符的ASCII码被存放在AL中,该字符中断返回时,输入字符的ASCII码被存放在AL中,该字符并显示在屏幕上并显示在屏幕上并显示在屏幕上并显示在屏幕上46463333. . . .键盘输入但不显示输入字符键盘输入但不显示输入字符键盘输入但不显示输入字符键盘输入但不显示输入字符向量号向量号向量号向量号 21H21H21H21H功能号功能号功能号功能号 8888该功能输入一字符,其ASCII码存放在AL中,但不显示该功能输入一字符,其ASCII码存放在AL中,但不显示该功能输入一字符,其ASCII码存放在AL中,但不显示该功能输入一字符,其ASCII码存放在AL中,但不显示这种功能往往在设置口令时使用这种功能往往在设置口令时使用。 这种功能往往在设置口令时使用这种功能往往在设置口令时使用例:例:例:例: MOV AH,8MOV AH,8MOV AH,8MOV AH,8 INT 21HINT 21HINT 21HINT 21H4444. . . .显示一字符显示一字符显示一字符显示一字符向量号向量号向量号向量号 21H21H21H21H功能号功能号功能号功能号 2222入口参数:DL=待显示字符的ASCII码入口参数:DL=待显示字符的ASCII码入口参数:DL=待显示字符的ASCII码入口参数:DL=待显示字符的ASCII码该功能显示DL中的字符该功能显示DL中的字符该功能显示DL中的字符该功能显示DL中的字符例:显示字母例:显示字母例:显示字母例:显示字母‘ ‘b’b’ MOV AH,MOV AH,MOV AH,MOV AH,2 2 MOV DL,MOV DL,MOV DL,MOV DL,62H62H INT 21HINT 21HINT 21HINT 21H47475555. . . . 在打印机上打印一字符在打印机上打印一字符在打印机上打印一字符在打印机上打印一字符向量号向量号向量号向量号 21H21H21H21H功能号功能号功能号功能号 5555入口参数:DL=待打印字符的ASCII码入口参数:DL=待打印字符的ASCII码入口参数:DL=待打印字符的ASCII码入口参数:DL=待打印字符的ASCII码6666. . . . 显示以显示以显示以显示以““““$$$$””””结尾的字符串结尾的字符串结尾的字符串结尾的字符串向量号向量号向量号向量号 21H21H21H21H功能号功能号功能号功能号 9999入口参数:DS:DX指向字符串的首地址入口参数:DS:DX指向字符串的首地址入口参数:DS:DX指向字符串的首地址入口参数:DS:DX指向字符串的首地址例:例:例:例:在显示器上显示在显示器上显示在显示器上显示在显示器上显示““““How are youHow are youHow are youHow are you????””””48487.7.7.7.字符串输入字符串输入字符串输入字符串输入 向量号向量号向量号向量号 21H21H21H21H 功能号功能号功能号功能号 0AH0AH0AH0AH 入口参数:入口参数:入口参数:入口参数:DSDSDSDS::::DXDXDXDX指向输入缓冲指向输入缓冲指向输入缓冲指向输入缓冲区。 区 输入缓冲区格式如下:第输入缓冲区格式如下:第输入缓冲区格式如下:第输入缓冲区格式如下:第1 1 1 1字节字节字节字节为预定的最大输入字符数,第为预定的最大输入字符数,第为预定的最大输入字符数,第为预定的最大输入字符数,第2 2 2 2字字字字节空出,待中断服务程序填入键盘节空出,待中断服务程序填入键盘节空出,待中断服务程序填入键盘节空出,待中断服务程序填入键盘连续输入到回车前实际输入字符数连续输入到回车前实际输入字符数连续输入到回车前实际输入字符数连续输入到回车前实际输入字符数第第第第3 3 3 3字节及以后字节,待中断服务字节及以后字节,待中断服务字节及以后字节,待中断服务字节及以后字节,待中断服务程序填入字符串的程序填入字符串的程序填入字符串的程序填入字符串的ASCIIASCIIASCIIASCII码例:例:例:例: 从键盘输入字符串从键盘输入字符串从键盘输入字符串从键盘输入字符串 D SEGMENT D SEGMENT D1 DB 20 D1 DB 20 DB ?DB ? DB 20 DUP(?)DB 20 DUP(?) D ENDS D ENDS C SEGMENT C SEGMENT ASSUME CS:C, ASSUME CS:C, DS:D DS:D ; ;说明代码段、数据段说明代码段、数据段说明代码段、数据段说明代码段、数据段 BG: MOV AX,D BG: MOV AX,D MOV DS,AXMOV DS,AX ; ;给给给给DSDS赋段值赋段值赋段值赋段值 LEA DX,D1 LEA DX,D1 ; ;将将将将D1D1的偏移地址送的偏移地址送的偏移地址送的偏移地址送DXDX MOV AH,0AH MOV AH,0AH ; ;输入字符串,最大为输入字符串,最大为输入字符串,最大为输入字符串,最大为2020个字符个字符个字符个字符 INT 21H INT 21H MOV AH,4CH MOV AH,4CH INT 21H INT 21H C ENDS C ENDS END BG END BG 49498.8.8.8.设置日期设置日期设置日期设置日期 向量号向量号向量号向量号 21H21H21H21H 功能号功能号功能号功能号 2BH2BH2BH2BH 入口参数:入口参数:入口参数:入口参数:CX=CX=CX=CX=年号,年号,年号,年号,DH=DH=DH=DH=月份,月份,月份,月份,DL=DL=DL=DL=日日日日例:例:例:例:MOV CX,2007MOV CX,2007MOV CX,2007MOV CX,2007 MOV DH,6 MOV DH,6 MOV DH,6 MOV DH,6 MOV DL,2 MOV DL,2 MOV DL,2 MOV DL,2 MOV AH,2BH MOV AH,2BH MOV AH,2BH MOV AH,2BH INT 21HINT 21HINT 21HINT 21H9.9.9.9.取日期取日期取日期取日期向量号向量号向量号向量号 21H21H21H21H功能号功能号功能号功能号 2AH2AH2AH2AH其功能与其功能与其功能与其功能与2BH2BH2BH2BH的操作相反。 的操作相反的操作相反的操作相反505010.10.10.10.设置时间设置时间设置时间设置时间 向量号向量号向量号向量号 21H21H21H21H 功能号功能号功能号功能号 2DH2DH2DH2DH 入口参数:入口参数:入口参数:入口参数:CH=CH=CH=CH=小时,小时,小时,小时,CL=CL=CL=CL=分,分,分,分,DH=DH=DH=DH=秒,秒,秒,秒,DL=DL=DL=DL=百分之一秒百分之一秒百分之一秒百分之一秒11.11.11.11.取时间取时间取时间取时间向量号向量号向量号向量号 21H21H21H21H功能号功能号功能号功能号 2CH2CH2CH2CH其功能与其功能与其功能与其功能与2DH2DH2DH2DH的操作相反的操作相反的操作相反的操作相反51511. 1. 已知程序中已知程序中已知程序中已知程序中DATADATA字数组中存放了字数组中存放了字数组中存放了字数组中存放了100H100H个补码数,读程序填空,并回答问题:个补码数,读程序填空,并回答问题:个补码数,读程序填空,并回答问题:个补码数,读程序填空,并回答问题:((((1 1)程序执行后,)程序执行后,)程序执行后,)程序执行后,AXAX与与与与BLBL存放的是何值存放的是何值存放的是何值存放的是何值((((2 2)画出此程序的流程图)画出此程序的流程图)画出此程序的流程图)画出此程序的流程图课堂测试课堂测试课堂测试课堂测试CODE SEGMENTCODE SEGMENTASSUME CS: CODE, DS: CODEASSUME CS: CODE, DS: CODESTART: MOV AX, CODESTART: MOV AX, CODEMOV DS, AXMOV DS, AXMOV CX, 100HMOV CX, 100HMOV SI, OFFSET DATAMOV SI, OFFSET DATAMOV AX, 0MOV AX, 0MOV DX, 0MOV DX, 0LP:LP:ADD AX, [SI]ADD AX, [SI]INC SIINC SIINC SIINC SIADC DX, ADC DX, LOOP LP LOOP LP ;;;;求和求和求和求和 MOV CX, 100HMOV CX, 100H ;求平均;求平均;求平均;求平均MOV SI, OFFSET DATAMOV SI, OFFSET DATALP1:LP1:CMP [SI], AXCMP [SI], AXJGE GRTJGE GRTINC BLINC BLGRT:GRT:INC SIINC SIINC SIINC SILOOP LP1 ;LOOP LP1 ;求小于平均数的个数求小于平均数的个数求小于平均数的个数求小于平均数的个数MOV AH, 4CHMOV AH, 4CHINT 21HINT 21HDATADATADW 100H DUP(?)DW 100H DUP(?)CODECODEENDSENDSEND STARTEND START((((1 1))))((((2 2))))((((3 3))))((((4 4))))52522. 2. 2. 2. 已知从数据段的有效地址已知从数据段的有效地址已知从数据段的有效地址已知从数据段的有效地址0070H0070H0070H0070H单元开始存放单元开始存放单元开始存放单元开始存放50505050个字节数个字节数个字节数个字节数据。 请编相应的指令程序,找出数据区中第一个为据请编相应的指令程序,找出数据区中第一个为据请编相应的指令程序,找出数据区中第一个为据请编相应的指令程序,找出数据区中第一个为88H88H88H88H的的的的数据,并将其在数据段中所处的位置序号存入有效地址为数据,并将其在数据段中所处的位置序号存入有效地址为数据,并将其在数据段中所处的位置序号存入有效地址为数据,并将其在数据段中所处的位置序号存入有效地址为1160H1160H1160H1160H的单元中的单元中的单元中的单元中要求:采用要求:采用要求:采用要求:采用CXCXCXCX保存计数值保存计数值保存计数值保存计数值50505050;用;用;用;用SISISISI存放序号;每行写注释存放序号;每行写注释存放序号;每行写注释存放序号;每行写注释5353。
