《汇编程序设计语言》由会员分享,可在线阅读,更多相关《汇编程序设计语言(47页珍藏版)》请在金锄头文库上搜索。
1、第四章第四章 8086汇编语言程序设计汇编语言程序设计几个概念几个概念8086汇编语言的语句汇编语言的语句8086汇编中的伪指令汇编中的伪指令8086汇编中的运算符汇编中的运算符汇编语言程序设计汇编语言程序设计宏定义与宏调用宏定义与宏调用系统调用系统调用几个概念几个概念汇编语言汇编语言汇编语言源程序汇编语言源程序汇编汇编汇编程序汇编程序什么是汇编程序什么是汇编程序? 汇编语言源程序不能由机器直接执行,必须翻译成由汇编语言源程序不能由机器直接执行,必须翻译成由汇编语言源程序不能由机器直接执行,必须翻译成由汇编语言源程序不能由机器直接执行,必须翻译成由机器代码组成的目标程序,这一过程称为机器代码组
2、成的目标程序,这一过程称为机器代码组成的目标程序,这一过程称为机器代码组成的目标程序,这一过程称为汇编汇编汇编汇编。把汇编。把汇编。把汇编。把汇编语言源程序翻译成目标程序的软件称为语言源程序翻译成目标程序的软件称为语言源程序翻译成目标程序的软件称为语言源程序翻译成目标程序的软件称为汇编程序汇编程序汇编程序汇编程序。如。如。如。如8086 8086 系统的汇编程序系统的汇编程序系统的汇编程序系统的汇编程序ASM-86ASM-86,及其扩展功能后的,及其扩展功能后的,及其扩展功能后的,及其扩展功能后的80868086宏汇编程序宏汇编程序宏汇编程序宏汇编程序MASM-86MASM-86。什么是汇编语
3、言? 汇编语言是一种采用助记符(英文缩写)表示的程序设计语言。使用汇编语言编写的程序称为汇编语言源程序。它与机器语言(0、1编写的代码)密切相关。机器语言与汇编语言机器语言与汇编语言机器语言:机器语言是计算机硬件系统能够直接识别机器语言:机器语言是计算机硬件系统能够直接识别 的计算机语言,每一条语句实际上是一条的计算机语言,每一条语句实际上是一条 二进制二进制形式的指令代码,由操作码和操作形式的指令代码,由操作码和操作 数组成。参见数组成。参见P52-53汇编语言:汇编语言用汇编语言:汇编语言用助记符助记符代替操作码,用代替操作码,用符号地符号地 址址代替操作数。代替操作数。4.1 8086汇
4、编语言的语句汇编语言的语句 汇编语言由指令性语句和指示性语句组成。汇编语言由指令性语句和指示性语句组成。一、指令性语句格式一、指令性语句格式标标号号: 操操作作码码 操操作作数数1, 操操作作数数2; 注注释释二、指示性语句格式二、指示性语句格式 标识符(名字)标识符(名字) 指示符(伪指令)指示符(伪指令) 表达式表达式 三、有关属性三、有关属性 存储器操作数的属性有三种:段值、段内偏移量和存储器操作数的属性有三种:段值、段内偏移量和 类型。类型。 指令语句的一般格式如下:指令语句的一般格式如下:标号:标号: 操作码操作码 操作数操作数;注释;注释1、标号:标号是机器指令语句存放、标号:标号
5、是机器指令语句存放地址地址的符号表示,的符号表示, 代表该指令目标代码的第一个字节地址,后代表该指令目标代码的第一个字节地址,后 面必须紧跟冒号面必须紧跟冒号“:” 。2、操作码:操作码为语句的核心成分,表示该语句的、操作码:操作码为语句的核心成分,表示该语句的 操作类型。操作类型。 3、操作数:操作数表示操作码的操作对象。、操作数:操作数表示操作码的操作对象。 4、注释:注释均以、注释:注释均以分号分号开始,它可占一行或多行,一开始,它可占一行或多行,一 般放在一条语句的后面。般放在一条语句的后面。伪指令语句格式伪指令语句格式如下:伪指令语句格式如下: 标识符标识符 伪指令伪指令 表达式表达
6、式 ;注释;注释 标识符标识符:标识符标识符是伪指令语句的一个可选项。是伪指令语句的一个可选项。 伪指令伪指令:伪指令伪指令指定汇编程序要完成的具体操指定汇编程序要完成的具体操 作,如作,如规定规定的数据定义伪指令的数据定义伪指令DB、DW、DD,段,段 定义伪指令定义伪指令SEGMENT,说明伪指令,说明伪指令ASSUME等。等。 表达式表达式:伪指令后面的:伪指令后面的表达式表达式可以是常数、字符可以是常数、字符 串、常量名、变量名等,其个数由具体的伪指令决串、常量名、变量名等,其个数由具体的伪指令决 定,各个操作数之间必须以定,各个操作数之间必须以“逗号逗号”分隔。分隔。 注释注释:伪指
7、令的:伪指令的注释注释必须以必须以“;”开始,其作用同开始,其作用同 指令语句中的注释部分。指令语句中的注释部分。空格空格存储器操作数即变量存储器操作数即变量存储器操作数即变量存储器操作数即变量 变变量量通通常常是是存存放放在在某某些些存存储储单单元元的的数数据据,以以变变量量名名的的形形式式出出现现在在程程序序中中,可可代代表表符符号号地地址址、数数据据区区或或存存储储区的区的第一个数据单元第一个数据单元,如,如BUF。 变量是用数据定义变量是用数据定义伪指令伪指令DB、DW、DD等定义的。等定义的。变量的三种属性:变量的三种属性: 段属性(段属性(SEGMENT):):表示变量存放在哪一个
8、逻表示变量存放在哪一个逻 辑段中(即变量所在段的段地址)。辑段中(即变量所在段的段地址)。 偏移属性(偏移属性(OFFSET):):表示变量的偏移地址,即表示变量的偏移地址,即 在逻辑段中距段的起始点的字节数在逻辑段中距段的起始点的字节数 类型属性(类型属性(Type):):表示变量占用存储单元的字节表示变量占用存储单元的字节 数。用数。用DB定义的变量类型属性为字节;用定义的变量类型属性为字节;用DW定义定义 的变量类型属性为字(的变量类型属性为字(2B);用);用DD定义的变量类定义的变量类 型属性为双字(型属性为双字(4B)。)。4.2 8086汇编中的伪指令汇编中的伪指令一、一、 符号
9、定义语句符号定义语句 1、等值语句、等值语句 格式:符号名格式:符号名 EQU 表达式表达式 功能:为功能:为常量常量、表达式表达式及其他各种及其他各种符号符号定义一个定义一个 等值等值的的符号名符号名,但它,但它不申请存储单元不申请存储单元。不。不 允许重新定义。允许重新定义。例:例: PORT EQU 1234 BUFF EQU PORT58 MEM EQU DS:BP20H COUNT EQU CX ABC EQU AAA2、等号语句、等号语句 格式:符号名格式:符号名=表达式表达式 功能:为功能:为常量常量、表达式表达式及其他各种及其他各种符号符号定义一个定义一个 等值等值的的符号名符
10、号名,并能对所定义的符号多次,并能对所定义的符号多次 重复重复定义,且以定义,且以最后一次最后一次定义的值为准。定义的值为准。 例:例:NUM34 NUM341二、变量定义语句二、变量定义语句 格式:格式: 符号名符号名 DB/DW/DD 表达式表达式 1 1、定义一组数据、定义一组数据 例例1 1: BUFF DW 1234H,0ABCDH,8EH DW 79DH,7B6AH 可以为一个或连续的可以为一个或连续的存储单元存储单元设置数值初值设置数值初值。2 2、定义一串字符、定义一串字符例例2 2: STR DB Welcome ! 用用DB伪指令为伪指令为ASCII字符串中的每一个字符字符
11、串中的每一个字符分配一个分配一个字节单元字节单元,字符串必须用单引号括起来。,字符串必须用单引号括起来。3 3、定义保留存储单元、定义保留存储单元 例例3 3: SUM DW ?,? 为数据项分配为数据项分配存储单元存储单元的一种方法,只是存储的一种方法,只是存储单元中不预置确定的值,常用来预留存储单元。单元中不预置确定的值,常用来预留存储单元。4 4、复制操作、复制操作 复制操作符复制操作符DUP(Duplication)可预置重复的数值可预置重复的数值 n DUP ( (表达式表达式) )例例4 4:ALL_ZERO DB 0,0,0,0,0 用复制操作可改为:用复制操作可改为: ALL_
12、ZERO DB 5 DUP(0) 为若干重复数据单元为若干重复数据单元分配存储单元分配存储单元。5 5、将已定义的地址存入内存单元、将已定义的地址存入内存单元 例例5 5: LIT DD CYC CYC:MOV AX,BX三、段定义语句三、段定义语句1 1、段定义语句格式:、段定义语句格式: 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDS 段定义伪指令用于将源程序划分成若干段,即代段定义伪指令用于将源程序划分成若干段,即代码段码段( (存放程序存放程序) ),数据段,数据段( (存放数据存放数据) ),堆栈段,附加,堆栈段,附加段。段。 只需要掌握只
13、需要掌握 段名段名 SEGMENT 段名段名 ENDS 2 2、段假设语句、段假设语句 ASSUME 段寄存器名:段名段寄存器名:段名, 功能:向汇编程序指示当前各段所用的段寄存功能:向汇编程序指示当前各段所用的段寄存 器,设定段寄存器与段的关系。器,设定段寄存器与段的关系。3 3、ORG伪指令、地址计数器伪指令、地址计数器$ 格式:格式:ORG 功能:指定在它之后的代码或数据存放的起始地功能:指定在它之后的代码或数据存放的起始地 址的偏移量,以表达式的值作为起始地址的偏移量,以表达式的值作为起始地 址,连续存放程序或数据。址,连续存放程序或数据。 $ $代表当前的地址。代表当前的地址。4 4
14、、END 表示源代码结束表示源代码结束 格式:格式:END 常数或表达式常数或表达式 功能:该语句标志整个程序的结束,是源程序的功能:该语句标志整个程序的结束,是源程序的 最后一条语句。最后一条语句。四、过程定义语句四、过程定义语句 过程名过程名 PROC NEAR/FAR RET 过程名过程名 ENDP功能:功能:完成过程定义,在过程体中实现过程的操作功完成过程定义,在过程体中实现过程的操作功 能。当一程序块被定义为过程后,程序中其他能。当一程序块被定义为过程后,程序中其他 地方就可用地方就可用CALL指令调用该过程。指令调用该过程。 调用过程的格式为:调用过程的格式为: CALL 过程名过
15、程名 过程名实质上是过程入口的符号地址,它和过程名实质上是过程入口的符号地址,它和标号标号一样,也有三种属性:段、偏移量和类型(距离)。一样,也有三种属性:段、偏移量和类型(距离)。 一般来说,被定义为过程的程序块中应该有返回一般来说,被定义为过程的程序块中应该有返回指令指令RET,执行,执行RET指令后,控制返回到原来调用指指令后,控制返回到原来调用指令的下条指令。令的下条指令。4.3 8086汇编中的运算符汇编中的运算符 一、常用运算符一、常用运算符1 1、算术运算符、算术运算符 (加)、(加)、(减)、(减)、* *(乘)、(乘)、/ /(除)、(除)、 MOD(求余)。(求余)。2 2
16、、逻辑运算符、逻辑运算符 AND、OR、XOR、NOT 3 3、关系运算符、关系运算符 EQ(相等)、(相等)、NE(不等、)、(不等、)、 LT(小于)、(小于)、GT(大于)、(大于)、 LE(小于等于)、(小于等于)、GE(大于等于)。(大于等于)。 关系成立,全关系成立,全1 关系不成立,全关系不成立,全0例:例: MOV DL , 10H LT 16 ; MOV DL,0例:例: AND AX , 555 GT 222 ; AND AX,0FFFFH 二、常用的操作符二、常用的操作符4 4、分析操作符、分析操作符1 1)SEG操作符操作符 取取段段地址地址例:例: MOV AX,SE
17、G BUFF2 2)OFFSET操作符操作符 取地址的取地址的偏移偏移量量 例:例:MOV BX,OFFSET BUFF3 3)TYPE操作符操作符 对于变量有对于变量有3 3种:种: 1字节型;字节型; 2字型;字型; 4双字型。双字型。 对于标号有对于标号有2 2种:种: 1NEAR(段内);(段内); 2FAR(段间)。(段间)。例:例:BUFF DB 20H MOV BX,TYPE BUFF MOV BX,014 4)LENGTH操作符操作符 格式:格式:LENGTH 变量名变量名 功能:返回一个变量名所占功能:返回一个变量名所占存储单元存储单元(字节、字(字节、字 或双字)的数目。若
18、用重复定义子句说或双字)的数目。若用重复定义子句说 明,则返回明,则返回DUP前的数字;若没有前的数字;若没有DUP 说明,则返回值总是说明,则返回值总是1。5)SIZE操作符操作符 SIZETYPELENGTH 例:例:BUFF DW 10 DUP (?) MOV CX,LENGTH BUF; MOV CX,10 MOV CX,SIZE BUF; MOV CX,205 5、综合运算符(合成操作符)、综合运算符(合成操作符)功能:功能:1 1、由已有的操作数建立新的操作数;、由已有的操作数建立新的操作数; 2 2、新操作数和已有的操作数类型不一样、新操作数和已有的操作数类型不一样。 新的类型只
19、在新的类型只在当前指令内有效当前指令内有效。1 1)PTR运算符运算符 格式:类型格式:类型 PTR 表达式表达式例:例:INC WORD PTR BX wx DW 1234H MOV AL,BYTE PTR wx MOV AH,BYTE PTR wx+12 2)THIS操作符操作符 格式:格式:THIS 类型类型( (或属性或属性) )例:例:FIRST EQU THIS BYTE SECOND DW 100 DUP (?) 运算符的优先级别见运算符的优先级别见p96p96。PTR:已分配存:已分配存 储器单元;储器单元;THIS:不分配存:不分配存 储器单元。储器单元。4.4 汇编语言程序
20、设计汇编语言程序设计 常用的汇编语言程序框架:常用的汇编语言程序框架: DATA SEGMENT;定义数据段;定义数据段VAL1 DB 12H , 8EH ;定义变量;定义变量 DATA ENDS ;数据段结束;数据段结束 CODE SEGMENT;定义代码段;定义代码段 ASSUME DS:DATA , CS: CODE;段属性说明;段属性说明 START: MOV AX , DATA;初始化;初始化DS MOV DS , AX MOV AX , 4C00H;返回;返回DOS INT 21H CODE ENDS ;代码段结束;代码段结束 END START ;源程序结束;源程序结束特点特点程
21、序分段程序分段语句由指令性和指示性语句组成语句由指令性和指示性语句组成两种程序框架两种程序框架框架一:框架一:框架一:框架一: DATADATA SEGMENT SEGMENT;定义数据段;定义数据段;定义数据段;定义数据段VAL1 DB 12H , 8EH VAL1 DB 12H , 8EH ;定义变量;定义变量;定义变量;定义变量 DATADATA ENDS ENDS ;数据段结束;数据段结束;数据段结束;数据段结束 CODE CODE SEGMENT SEGMENT;定义代码段;定义代码段;定义代码段;定义代码段 ASSUME DS:DATA , CS: CODE ASSUME DS:D
22、ATA , CS: CODE;段属性说明;段属性说明;段属性说明;段属性说明 START: MOV AX , DATASTART: MOV AX , DATA;初始化;初始化;初始化;初始化DSDS MOV DS , AX MOV DS , AX ; ; 填写代码填写代码填写代码填写代码 MOV AX , 4C00H MOV AX , 4C00H;返回;返回;返回;返回DOSDOS INT 21H INT 21H CODE ENDSCODE ENDS ;代码段结束;代码段结束;代码段结束;代码段结束 END START END START ;源程序结束;源程序结束;源程序结束;源程序结束框架二
23、:框架二:框架二:框架二: DATADATA SEGMENT SEGMENT;定义数据段;定义数据段;定义数据段;定义数据段VAL1 DB 12H , 8EH VAL1 DB 12H , 8EH ;定义变量;定义变量;定义变量;定义变量 DATADATA ENDS ENDS ;数据段结束;数据段结束;数据段结束;数据段结束 CODE CODE SEGMENT SEGMENT;定义代码段;定义代码段;定义代码段;定义代码段MAINMAIN PROC FAR PROC FAR ASSUME DS:DATA , CS: CODE ASSUME DS:DATA , CS: CODE;段属性说明;段属性
24、说明;段属性说明;段属性说明 START: PUSH DSSTART: PUSH DS MOV AX , 0 MOV AX , 0 PUSH AX PUSH AX MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX ;填写代码;填写代码;填写代码;填写代码 RETRETMAINMAIN ENDP ENDP CODE ENDSCODE ENDS ;代码段结束;代码段结束;代码段结束;代码段结束 END START END START ;源程序结束;源程序结束;源程序结束;源程序结束一、汇编语言程序设计基本步骤一、汇编语言程序设计基本步骤 1.1.分析问题,确定
25、模型分析问题,确定模型2.2.确定算法确定算法 3.3.绘制流程图绘制流程图4.4.编写程序编写程序5.5.检查和调试检查和调试 二、汇编语言程序的基本结构二、汇编语言程序的基本结构1、顺序结构、顺序结构 p972 2、分支结构、分支结构 举例举例p98实现用查表法确定多分支用查表法确定多分支例:某应用程序主菜单有例:某应用程序主菜单有8 8个可选项,其入口地址分别个可选项,其入口地址分别 记为记为R0、R1R7。要求编制程序根据变量。要求编制程序根据变量N的的 值转向相应的处理程序(值转向相应的处理程序(N为入口编号)。为入口编号)。步骤:步骤: a a、把入口地址放在、把入口地址放在BAS
26、E开始的内存单元;开始的内存单元; b b、根据、根据N的的内容进行查表实现分支转移。内容进行查表实现分支转移。例:某应用程序主菜单有例:某应用程序主菜单有8个可选项,其入口地址分别个可选项,其入口地址分别 记为记为R0、R1R7。要求编制程序根据变量。要求编制程序根据变量N的值的值 转向相应的处理程序(转向相应的处理程序(N为入口编号)。为入口编号)。DATA SEGMENT ADD BX,AXBASE DW R0,R1,R2,R3 MOV AX,BX DW R4,R5,R6,R7 JMP AX N DB 5 R0:DATA ENDS JMP OK CODE SEGMENT R1: ASSU
27、ME CS:CODE,DS:DATA JMP OK START:MOV AX,DATA MOV DS,AX R7: MOV AL,N OK:MOV AH,4CH ADD AL,AL INT 21H MOV AH,0 CODE ENDS MOV BX,OFFSET BASE END START 3、循环结构、循环结构 循环控制有三种:循环控制有三种: 计数法计数法 条件法(比较条件结束)条件法(比较条件结束) 多重循环(设定标志结束)多重循环(设定标志结束)Call proc1ret4 4、子程序、子程序 (1) 实现方法实现方法主程序有调用指令主程序有调用指令CALL子程序有返回指令子程序有返
28、回指令RET(2) 特点特点 CALL指令与指令与RET缺一不可缺一不可现场保护现场保护入口出口参数设置入口出口参数设置子程序编写子程序编写:1、子程序组成、子程序组成(1) 使用说明使用说明a、子程序功能、子程序功能b、使用寄存器情况、使用寄存器情况c、入口出口参数、入口出口参数(2) 程序体程序体入口出口参数传递入口出口参数传递现场保护现场保护功能程序段功能程序段例例:编写编写AX*10AX子程序子程序;这是一个乘;这是一个乘10子程序子程序;使用寄存器;使用寄存器AX;入口:;入口:AX,出口:,出口:AXMUL10PROC FARPUSH BX ;保护现场保护现场PUSHFADD AX
29、,AX;2AXMOV BX,AX;2AXBXADD AX,AX;4AXADD AX,AX;8AXADD AX,BX;10AXPOPF ;恢复现场;恢复现场POP BXRETMUL10ENDP功功能能程程序序段段2、现场保护和入口出口参数传递、现场保护和入口出口参数传递(1)现场保护)现场保护方案一:在子程序中保护方案一:在子程序中保护 灵活,不方便灵活,不方便方案二:在主程序中保护方案二:在主程序中保护 方便,不灵活方便,不灵活(2)参数传递)参数传递寄存器传递寄存器传递变量传递变量传递堆栈传递堆栈传递4.4 4.4 系统调用系统调用一、一、PCDOS执行流程执行流程BIOSIBMBIOIBM
30、DOS键盘命令键盘命令命令处理程序命令处理程序文件管理文件管理基本输入基本输入/输出输出BIOS用户程序用户程序用户程序用户程序ROMIBMBIOIBMDOS二、二、DOS系统子程序功能系统子程序功能1、磁盘管理、磁盘管理2、内存管理、内存管理3、系统输入、系统输入/输出输出共共87个子程序个子程序三、系统功能调用三、系统功能调用 对对87个子程序进行编号,根据编号进行相关处理个子程序进行编号,根据编号进行相关处理格式:格式:1、入口参数、入口参数(可选可选)2、编号、编号AH3、INT 21H编号编号AHINT 21HAH=11号调号调用用AH=22号调号调用用常用的系统调用:常用的系统调用
31、: 1、1号调用键盘输入单字符号调用键盘输入单字符功能:从键盘输入一个字符,若功能:从键盘输入一个字符,若Ctrl+Break键,则退出。键,则退出。输入参数:无输入参数:无输出参数:输出参数:AL=ASCII码。码。调用格式:调用格式:MOV AH,1 INT 21H2、8号调用无回显键盘输入单字符号调用无回显键盘输入单字符3、6号调用显示及输入,若号调用显示及输入,若DL=0FFH输入,否则显输入,否则显 示。示。4、9号调用输出字符串,号调用输出字符串,DS:DX=输出字符缓冲区输出字符缓冲区 首地址。首地址。5、10号调用输入字符串号调用输入字符串设置缓冲区注意事项:设置缓冲区注意事项
32、:缓冲区第缓冲区第1字节存放预定字符个数,最多字节存放预定字符个数,最多255个;个;缓冲区第缓冲区第2字节保留,用于调用返回时存放实际输入字节保留,用于调用返回时存放实际输入 的字节个数;的字节个数;缓冲区第缓冲区第3字节开始,存放输入的字符;字节开始,存放输入的字符;缓冲区要考虑留缓冲区要考虑留1个字节作为回车符。个字节作为回车符。例:例: BUF DB 20 DB ? DB 20 DUP (?) ;最多可键入;最多可键入19个字符个字符 . MOV DX,OFFSET BUF MOV AH,0AH INT 21H4.5 宏定义与宏调用宏定义与宏调用一、宏定义和宏调用一、宏定义和宏调用1、格式、格式 宏指令名宏指令名 MACRO 参数表参数表 ;宏定义体宏定义体 ENDM2、优点、优点缩短源程序长度,但不减少代码长度;缩短源程序长度,但不减少代码长度;程序易读。程序易读。3、参数可以是多种形式、参数可以是多种形式 与过程调与过程调用不同,它不用不同,它不使用堆栈。使用堆栈。作业:作业:P1161,4,6