微机原理本科4_第1页
微机原理本科4_第2页
微机原理本科4_第3页
微机原理本科4_第4页
微机原理本科4_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 汇编语言程序设计* 汇编语言的程序格式汇编语言的程序格式* 伪指令伪指令* 汇编语言程序上机过程汇编语言程序上机过程* 程序设计基本方法程序设计基本方法汇编语言的程序格式* 汇编语言程序的结构汇编语言程序的结构* 汇编语言语句类型及格式汇编语言语句类型及格式* 汇编语言的数据与表达式汇编语言的数据与表达式源程序的一般格式STACK SEGMENT STACK ENDS DATA SEGMENT DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS: DATA, SS:STACKSTART: CODE ENDS END START源程序的一般格式-例 例例 编

2、写一个两字相加的程序编写一个两字相加的程序DSEG SEGMENT ;定义数据段;定义数据段DATA1 DW 1234H ;定义被加数;定义被加数DATA2 DW 5678H ;定义加数;定义加数DSEG ENDS ;数据段结束;数据段结束ESEG SEGMENT ;定义附加段;定义附加段SUM DW 2 DUP(?)(?) ;定义存放结果区;定义存放结果区ESEG ENDS ;附加段结束;附加段结束CSEG SEGMENT ;定义代码段;定义代码段;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址 ASSUME CS:CSEG,DS:

3、DSEG,ES:ESEGSTART: MOV AX,DSEG ;START为程序开始执行的启动标号为程序开始执行的启动标号 MOV DS,AX ;初始化初始化DS MOV AX,ESEG MOV ES,AX ;初始化初始化ES LEA SI,SUM ;存放结果的偏移地址送存放结果的偏移地址送SI MOV AX,DATA1 ;取被加数取被加数 ADD AX,DATA2 ;两数相加两数相加 MOV ES:SI,AX ;和送附加段的和送附加段的SUM单元中单元中 HLTCSEG ENDS ;代码段结束代码段结束 END START ;源程序结束源程序结束源程序的结构特点*汇编语言程序通常由若干段组成

4、,段由伪指令汇编语言程序通常由若干段组成,段由伪指令SEGMENTSEGMENT与与ENDSENDS定定义,各段顺序任意,段的数目按需要确定,原则上不受限制。义,各段顺序任意,段的数目按需要确定,原则上不受限制。*段由若干语句组成,语句以指令为主体而构成。一条语句写在一段由若干语句组成,语句以指令为主体而构成。一条语句写在一行上,书写时语句的各部分应尽量对齐行上,书写时语句的各部分应尽量对齐*汇编语言程序中至少要有一个启动标号,作为程序开始执行时目汇编语言程序中至少要有一个启动标号,作为程序开始执行时目标代码的入口地址。启动标号常用标代码的入口地址。启动标号常用STARTSTART、BEGIN

5、BEGIN、MAINMAIN等命名。等命名。*为增加程序的可读性,可在汇编语言语句为增加程序的可读性,可在汇编语言语句“ ;”“ ;”后加上注释。后加上注释。汇编语言语句类型及格式*汇编语言语句的类型汇编语言语句的类型* 指令语句是可执行语句,在汇编中要产生对应的目标代码,指令语句是可执行语句,在汇编中要产生对应的目标代码,CPUCPU根据这些代码才能执行相应的操作。根据这些代码才能执行相应的操作。* 伪指令语句是不可执行语句,在汇编中不产生目标代码,用伪指令语句是不可执行语句,在汇编中不产生目标代码,用于指示汇编程序如何汇编源程序,利用它定义和说明常量和于指示汇编程序如何汇编源程序,利用它定

6、义和说明常量和变量的属性及存储器单元的分配等。变量的属性及存储器单元的分配等。* 宏指令语句是以一个宏名定义的一段指令序列,在汇编中凡宏指令语句是以一个宏名定义的一段指令序列,在汇编中凡是出现宏指令语句的地方,都会有相应的指令语句序列的目是出现宏指令语句的地方,都会有相应的指令语句序列的目标代码插入。标代码插入。*语句的格式语句的格式* * 标号* 标号标号* 标号后跟冒号标号后跟冒号“:”。* 它可以缺省,是可供选择的标识符它可以缺省,是可供选择的标识符标号的规则* 由字母由字母( (a az z,A AZ)Z)、数字数字(0(09)9)或某些特殊字符或某些特殊字符(,- -,?)?)组成组

7、成* 第一个字符必须是字母第一个字符必须是字母( (a az z,A AZ)Z)或某些特殊的符或某些特殊的符号号(,- -,?)?),但,但“?”“?”不能单独作标识符不能单独作标识符* 标识符有效长度为标识符有效长度为3131个字符,若超过个字符,若超过3131个字符,则只个字符,则只保留前面的保留前面的3131个字符为有效标识符个字符为有效标识符* CPUCPU中的寄存器名、汇编语言中的保留字等均不能作为中的寄存器名、汇编语言中的保留字等均不能作为标号和符号名标号和符号名常量与变量* 常量常量 数值常量、字符串常量、符号常量数值常量、字符串常量、符号常量* 变量变量用数据定义伪指令用数据定

8、义伪指令DBDB、DWDW、DDDD定义变量定义变量 DATA SEGMENT DATA SEGMENT DA1 DB 12H DA1 DB 12H ;定义一个字节数据;定义一个字节数据 DA2 DD 0FEDCBA90H DA2 DD 0FEDCBA90H ;定义一个双字数据;定义一个双字数据 DA3 DW 5678H DA3 DW 5678H ;定义一个字数据;定义一个字数据 DATA ENDS DATA ENDS变量的属性* 变量的属性变量的属性* 段属性:段基址,即变量所在段的段基址段属性:段基址,即变量所在段的段基址* 偏移量属性:段内偏移地址,即变量所在的偏移量属性:段内偏移地址,

9、即变量所在的地址与所在段的段基址之间的字节数地址与所在段的段基址之间的字节数* 类型属性:数据定义伪指令分别指示变量是类型属性:数据定义伪指令分别指示变量是按字节、字、双字、按字节、字、双字、4 4字、字、1010字节操作字节操作标号属性* 标号标号* 表示指令语句的符号地址,其具有变量的三个属性,表示指令语句的符号地址,其具有变量的三个属性,但其类型属性定义为段内属性(但其类型属性定义为段内属性(NEARNEAR)和段间属性和段间属性(FARFAR)* 段属性段属性* 偏移量属性偏移量属性* 类型属性类型属性表达式与运算符* 表达式和运算符表达式和运算符* 算术运算符算术运算符* 逻辑运算符

10、逻辑运算符* 关系运算符关系运算符* 数值返回运算符数值返回运算符* 修改属性运算符修改属性运算符表达式和运算符*算术运算符算术运算符 加、减、乘、除、模运算、左移位、右移位等加、减、乘、除、模运算、左移位、右移位等*逻辑运算符逻辑运算符 AND AND、OROR、NOTNOT、XORXOR*关系运算符关系运算符 EQ EQ()、()、NENE()、()、LTLT()、()、LELE()、()、GTGT()、()、GEGE()()*数值返回运算符数值返回运算符* SEGSEG:返回段基址返回段基址* OFFSETOFFSET:返回偏移地址返回偏移地址* TYPETYPE:返回元素字节数返回元素

11、字节数* LENGTHLENGTH:返回变量单元数返回变量单元数* SIZESIZE:返回变量总字节数返回变量总字节数属性修改运算符* LABELLABEL:定义类型属性定义类型属性* PTRPTR:修改类型属性修改类型属性* HIGHHIGH:取高字节取高字节* LOWLOW:取低字节取低字节表达式和运算符-例*逻辑运算符的应用逻辑运算符的应用MOV AL,NOT 10101010B ;(;(AL)01010101BMOV AL,11110000B AND 10111101B ;(;(AL)10110000BMOV AL,10100000B OR 00000101B ;(;(AL)10100

12、101B*关系运算符的应用关系运算符的应用MOV AX,5 EQ 101B ;(;(AX)0FFFFHMOV BH,10H GT 16 ;(;(BH)0*数值返回运算符的应用数值返回运算符的应用K1 DB 30H,31H,32HK2 DW 4041H,4043HK3 DW 20H DUP(0)K4 DD 50515253HMOV AL,TYPE K1 ;等效于;等效于MOV AL,1MOV AH,TYPE K2 ;等效于;等效于MOV AH,2MOV AL, LENGTH K3 ;(;(AL)20H,返回,返回DUP前面的数值前面的数值MOV CL, LENGTH K4 ;(;(CL)01HM

13、OV BL, SIZE K3 ;(;(BL)40HMOV DL, SIZE K4 ;(;(DL)04H属性修改运算符-例*段属性运算符的应用段属性运算符的应用MOV AX,ES:BX ;用附加段;用附加段ES取代默认的数据段取代默认的数据段DSMOV BL,DS:BP ;用数据段;用数据段DS取代默认的堆栈段取代默认的堆栈段SS* PTRPTR运算符的应用运算符的应用N1 DB 3,6,9MOV AX,WORD PTR N1 ;临时指定;临时指定N1为字类型,(为字类型,(AX)0603H*HIGHHIGH和和LOWLOW运算符的应用运算符的应用NUM EQU 2456HMOV AL,HIGH

14、 NUM ;等效于;等效于 MOV AL,34HMOV BL,LOW NUM ;等效于;等效于 MOV BL,56H属性修改运算符-例* LABELLABEL运算符的应用运算符的应用* 格式:标识符格式:标识符 LABEL LABEL 类型类型* 标识符可是变量名或标号标识符可是变量名或标号 例:例: VALUE LABEL BYTE VALUE LABEL BYTE伪指令* 符号定义伪指令符号定义伪指令* 数据定义伪指令数据定义伪指令* 段定义伪指令段定义伪指令* 段寻址伪指令段寻址伪指令* 过程定义伪指令过程定义伪指令* 模块定义与连接伪指令模块定义与连接伪指令* 宏命令伪指令宏命令伪指令

15、* 其他伪指令其他伪指令符号定义伪指令* 等值语句等值语句CR EQU 0DH CR EQU 0DH ;常量;常量AA EQU ASCII_TABLE AA EQU ASCII_TABLE ;变量;变量VAR EQU TENVAR EQU TEN* *2+1024 2+1024 ;数值表达式;数值表达式ADR EQU ESADR EQU ES:BP+DI+5BP+DI+5 ;地址表达式;地址表达式GOTO EQU JMP GOTO EQU JMP ;指令助记符;指令助记符* 等号语句等号语句NUM=488 NUM=488 ;定义;定义NUMNUM等于等于488488NUM=NUM+1 NUM=

16、NUM+1 ;定义;定义NUMNUM等于等于489489等语句与语句与等号语句区别等号语句区别* 两者功能相同两者功能相同* EQUEQU定义过的表达式,不能重复定义定义过的表达式,不能重复定义 CONST EQU 20CONST EQU 20 . . CONST EQU 25CONST EQU 25 CONST = 20 CONST = 20 . . CONST = 25CONST = 25数据定义伪指令*例例1 1DATA DB 11HDATA DB 11H,33H 33H ;定义包含两个元素的字节变量;定义包含两个元素的字节变量DATADATANUM DW 100NUM DW 100*

17、*5+88 5+88 ;定义一个字类型变量;定义一个字类型变量NUMNUM,其初值为表达式的值,其初值为表达式的值SUM DQ 0011223344556677 SUM DQ 0011223344556677 ;将;将4 4个字存入变量个字存入变量SUMSUM。*例例2 2STR1 DB COMPUTER STR1 DB COMPUTER ;定义一个字符串,字符串的首地址为;定义一个字符串,字符串的首地址为STR1STR1STR2 DW AASTR2 DW AA,BCBC,DE DE ;给两个字符组成的字符串分配两个字节;给两个字符组成的字符串分配两个字节存储单元存储单元DATA DW DAT

18、A DW ?,?,?,?,? ;为;为DATADATA预留预留6 6个存储单元个存储单元*例例3 3DATA1 DB 20 DUPDATA1 DB 20 DUP(?)(?) ;为变量;为变量DATA1DATA1分配分配2020个字节的空间,初值为任意值个字节的空间,初值为任意值DATA2 DW DATA2 DW ? ;为变量;为变量DATA2DATA2分配分配2 2个字节的空间,初值为任意值个字节的空间,初值为任意值DATA3 DB 20 DUPDATA3 DB 20 DUP(30H30H) ;为变量;为变量DATA3DATA3分配分配2020个字节的空间,初值均为个字节的空间,初值均为30H

19、30H段定义伪指令*格式格式段名段名 SEGMENT SEGMENT 定位类型定位类型 组合类型组合类型 类别名类别名 段名段名 ENDSENDS*段名段名 表示逻辑段的名称,由程序员确定。一个段开始和结尾的段名必须一致,表示逻辑段的名称,由程序员确定。一个段开始和结尾的段名必须一致,否则会出现语法错误否则会出现语法错误*定位类型定位类型* BYTEBYTE:表示本段起始地址可以从任意地址开始,地址为表示本段起始地址可以从任意地址开始,地址为XXXXXHXXXXXH* WORDWORD:表示本段从偶字节地址开始,地址为表示本段从偶字节地址开始,地址为XXXXEHXXXXEH* PARAPARA

20、:表示本段从一个节(一个节为表示本段从一个节(一个节为1616字节)的边界开始,地址为字节)的边界开始,地址为XXXX0HXXXX0H* PAGEPAGE:表示本段从一个页(一个页为表示本段从一个页(一个页为256256字节)的边界开始,地址为字节)的边界开始,地址为XXX00HXXX00H段定义伪指令(续)*组合类型组合类型* NONENONE:表示本段与其他段无连接关系表示本段与其他段无连接关系* PUBLICPUBLIC:表示本段与同名段在一起,只有一个起始地址表示本段与同名段在一起,只有一个起始地址* COMMONCOMMON:表示同名段的各段在同一起始地址存放,形成一个覆盖段,表示同

21、名段的各段在同一起始地址存放,形成一个覆盖段,连接后的长度以同名段中最长的段确定连接后的长度以同名段中最长的段确定* STACKSTACK:表示同名段的各段连接成一个连续段,且只有一个起始地址表示同名段的各段连接成一个连续段,且只有一个起始地址赋给段寄存器赋给段寄存器SSSS* MEMORYMEMORY:表示本段在存储器中,定位在所有其他段的最高地址处表示本段在存储器中,定位在所有其他段的最高地址处* ATAT表达式:表示本段定位在表达式指定的节位置处表达式:表示本段定位在表达式指定的节位置处*类别名类别名* 是用引号包括起来的字符串,由设计人员自己定义的名字。在程序是用引号包括起来的字符串,

22、由设计人员自己定义的名字。在程序连接时,会将类别名相同的段存到存储器中连续的区域。连接时,会将类别名相同的段存到存储器中连续的区域。段寄存器说明伪指令*格式:格式:ASSUME ASSUME 段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,*求从求从NUMNUM开始的开始的1212个无符号字节数的和,结果放在个无符号字节数的和,结果放在SUMSUM字单元中。字单元中。DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34HDB 62H,45H,75H,49HSUM DW ?DATA ENDSSTACK SEGMENT

23、DB 100 DUP(?)(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AXLEA SI,NUM MOV CX,12 XOR AX,AXNEXT: ADD ALSI ADC AH,0 INC SI LOOP NEXT MOV SUM,AX HLT CODE ENDS END BEGIN 过程定义伪指令*格式:格式:过程名过程名 PROC NEAR/FARPROC NEAR/FAR RET RET

24、过程名过程名 ENDPENDP例例 编写一个延时编写一个延时50ms50ms的子程序的子程序DELAY PROC DELAY PROC ;定义一个近过程;定义一个近过程 PUSH BX PUSH BX ;保护;保护BXBX原来的内容原来的内容 PUSH CX PUSH CX ;保护;保护CXCX原来的内容原来的内容 MOV BLMOV BL,5 5 ;外循环次数;外循环次数NEXTNEXT: MOV CXMOV CX,2801 2801 ;内循环次数(实现延时;内循环次数(实现延时10ms10ms)W10MSW10MS:LOOP W10MS LOOP W10MS ;(;(CXCX)00则循环则

25、循环 DEC BL DEC BL ;修改外循环计数值;修改外循环计数值 JNZ NEXT JNZ NEXT ;(;(BXBX)00则进行外循环则进行外循环 POP CX POP CX ;恢复;恢复CXCX原来的内容原来的内容 POP BX POP BX ;恢复;恢复BXBX原来的内容原来的内容 RET RET ;过程返回;过程返回DELAY ENDP DELAY ENDP ;过程结束;过程结束模块定义与连接伪指令*模块定义伪指令模块定义伪指令格式:格式:NAME NAME 标识符标识符 END END 启动标号或过程名启动标号或过程名*模块连接伪指令模块连接伪指令* 全局符号伪指令全局符号伪指

26、令* 引用伪指令引用伪指令宏命令伪指令*宏定义宏定义例例 用宏指令定义两个字节数相加,结果存入用宏指令定义两个字节数相加,结果存入RESULTRESULT单元的操作。单元的操作。ADDM MACRO OPR1ADDM MACRO OPR1,OPR2OPR2,RESULT RESULT MOV AL MOV AL,OPR1OPR1 ADD AL ADD AL,OPR2OPR2 MOV RESULT MOV RESULT,ALAL ENDM ENDM*宏调用宏调用例例 将上例中的宏定义进行宏调用、宏展开操作如将上例中的宏定义进行宏调用、宏展开操作如下:下:ADDM 88ADDM 88,3636,S

27、UM SUM ADDM BRADDM BR,TABTAB,SUMSUM*宏展开宏展开 + MOV AL+ MOV AL,8888+ ADD AL+ ADD AL,3636+ MOV SUM+ MOV SUM,ALAL + MOV AL+ MOV AL,BRBR+ ADD AL+ ADD AL,TABTAB+ MOV SUM+ MOV SUM,ALAL *宏的取消宏的取消其它伪指令*定位伪指令定位伪指令例例 伪指令伪指令ORGORGDATA SEGMENTDATA SEGMENT ORG 30H ORG 30HDB1 DB 12HDB1 DB 12H,34H34HDATA ENDSDATA EN

28、DS汇编语言程序上机过程* 建立汇编语言的工作环境建立汇编语言的工作环境* 上机操作过程上机操作过程 * DEBUGDEBUG的使用方法的使用方法建立汇编语言的工作环境*编辑程序,文件名编辑程序,文件名 EDIT.COMEDIT.COM*汇编程序,文件名汇编程序,文件名 MASM.EXE MASM.EXE *连接程序,文件名连接程序,文件名 LINK.EXE LINK.EXE *调试程序,文件名调试程序,文件名 DEBUG.EXE DEBUG.EXE *LIB.EXELIB.EXE,库管理程序,库管理程序 *CREF.EXECREF.EXE,符号索引文件处理程序,符号索引文件处理程序 *EXE

29、2BIN.EXEEXE2BIN.EXE,将,将EXEEXE转换为转换为COMCOM的文件格式转换程序的文件格式转换程序上机操作过程*编辑编辑*对编辑完成的源程序在存盘时扩展名必须加写对编辑完成的源程序在存盘时扩展名必须加写.ASM.ASM*一定要严格遵守汇编语言书写格式及段结构的格式来编写程序一定要严格遵守汇编语言书写格式及段结构的格式来编写程序*汇编汇编*汇编过程就是将汇编语言源程序转换成机器能够识别的目标代码程序,即汇编过程就是将汇编语言源程序转换成机器能够识别的目标代码程序,即OBJOBJ的二进制文件。还可生成扩展名为的二进制文件。还可生成扩展名为.LST.LST的列表文件,扩展名为的列

30、表文件,扩展名为.CRF.CRF的符的符号索引文件。号索引文件。*连接连接* 所谓连接是用连接程序所谓连接是用连接程序LINK.EXELINK.EXE把若干个经汇编后产生的把若干个经汇编后产生的.OBJ.OBJ文件文件及指定的库文件连接起来,产生可执行的及指定的库文件连接起来,产生可执行的.EXE.EXE文件。文件。*调试调试DEBUG的使用方法*DEBUGDEBUG的运行的运行*DEBUGDEBUG的主要命令的主要命令* D D,显示内存单元内容;,显示内存单元内容;* U U,反汇编命令;,反汇编命令;* R R,显示与修改寄存器内容;,显示与修改寄存器内容;* E E,修改内存单元内容;

31、,修改内存单元内容;* A A,汇编命令;,汇编命令;* T T、P P,单步执行指令;,单步执行指令;* G G,连续执行指令;,连续执行指令;* N N,指定装入文件名或写入文件名;,指定装入文件名或写入文件名;* L L,装入,装入N N指定的文件;指定的文件;* W W,将指定内容写入,将指定内容写入N N指定的文件;指定的文件;* Q Q,退出,退出DEBUGDEBUG程序,返回操作系统状态程序,返回操作系统状态程序设计基本方法* 程序设计概述程序设计概述* 顺序结构程序设计顺序结构程序设计* 分支结构程序设计分支结构程序设计* 循环结构程序设计循环结构程序设计* 子程序设计子程序设

32、计* 程序设计举例程序设计举例程序设计概述*程序设计的步骤程序设计的步骤*分析问题分析问题 *建立数学模型建立数学模型 *确定算法。确定算法。 *绘制流程图绘制流程图 *分配内存空间分配内存空间 *编制程序与静态检查。编制程序与静态检查。 *上机调试上机调试 *试运行和分析结果试运行和分析结果 *整理资料投入运行整理资料投入运行*返回返回DOSDOS的方法的方法*MOV AHMOV AH,4CH 4CH ;功能号送;功能号送AHAH*INT 21H INT 21H ;返回;返回DOSDOS*程序的基本结构程序的基本结构*顺序结构,分支结构,循环结构顺序结构,分支结构,循环结构 顺序结构程序设计

33、*例例 编写程序,计算编写程序,计算(W-(X(W-(X* *Y+Z-100)/WY+Z-100)/W,其中,其中W W、X X、Y Y、Z Z均为均为1616位带符位带符号数,计算结果的商存入号数,计算结果的商存入AXAX,余数存入,余数存入DXDXDATA SEGMENTW DW 268X DW 73Y DW 48Z DW 85DATA ENDSSTACK SEGMENT DW 100 DUP(?)(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,X ;计算

34、;计算X*Y IMUL Y MOV CX,AX ;用;用CX存储结果低位存储结果低位MOV BX,DX ;用;用BX存储结果高位存储结果高位 MOV AX,Z ;计算;计算X*Y+Z顺序结构程序设计-例*例例 把非压缩十进制数把非压缩十进制数DAT1转换为压缩十进制数。转换为压缩十进制数。 DOSSEG MODEL SMALL STACK 64H DATA DAT1 DW 0908H ;非压缩十进制数;非压缩十进制数0908H CODE BEGIN: MOV AX,DATA MOV DS,AX MOV AX,DAT1 ;AX0908H MOV CL,4 ;CL 4 SAL AH,CL ;09字

35、节左移字节左移4位,位,AH=90H ROL AX,CL ;9008H字循环左移字循环左移4位,位,AX=0089H ROL AL,CL ;89字节循环左移字节循环左移4位,位,AL=98H MOV BYTE PTR DAT1,AL ;DAT198H,压缩十进制数,压缩十进制数98H MOV AH,4CH ;返回;返回DOS INT 21H END BEGIN 分支结构程序设计图图4-1 两两路路分分支支结结构构图图T程序段1条件F程序段2图图4-1 两两路路分分支支结结构构图图T程序段1条件F程序段2图图4-2 多多路路分分支支结结构构图图程序段1多路条件程序段2程序段n图图4-2 多多路路

36、分分支支结结构构图图程序段1多路条件程序段2程序段n两路分支程序设计*例例 用比较指令和条件转移指令实现两路分支的程序段。用比较指令和条件转移指令实现两路分支的程序段。 MOV AX,M ;假定;假定M和和N为有符号数为有符号数 MOV BX,N CMP AX,BX ;比较;比较 M和和N的大小,影响标志位,准备条件的大小,影响标志位,准备条件 JG NEXT ;MN时转移,注意若时转移,注意若M、N为无符号数时用为无符号数时用JA指令指令 ;分支程序;分支程序2 JMP DONE NEXT: ;分支程序;分支程序1 DONE:RET两路分支程序设计-例题程序如下:程序如下:DATA SEGM

37、ENT X DB ? Y DB ?DATA ENDSCODE SEGMENT ;代码段;代码段START:PROC FARASSUME CS:CODE,DS:DATA PUSH DS ;保存返回地址;保存返回地址 MOV AX,0 PUSH AX MOV AX,DATA ;初始化;初始化DS MOV DS,AX MOV AL,X ;取数;取数X CMP AL,0 ;准备条件;准备条件 JNS PLUS ;X0则转移则转移 NEG AL ;X0则求补则求补 JMP DONEPLUS: ADD AL,20 ;X0时,时,X+20DONE: MOV Y,AL ;计算结果送;计算结果送Y RET ;返

38、回;返回START ENDPCODE ENDS END START ;汇编结束;汇编结束多路分支程序设计SUB1-LSUB1-HSUB2-LSUB2-HSUB3-LSUB3-H图图4-3 地址跳转表地址跳转表表首地址JMPSUB1JMPSUB2图图4-4 指令跳转表指令跳转表表首地址多路分支程序设计-例*例例 假设某企业有假设某企业有1010类人员,对每类人员的工资各有不同的处理方法和计类人员,对每类人员的工资各有不同的处理方法和计算程序。对于一类人员应执行程序段算程序。对于一类人员应执行程序段CLASS1CLASS1,二类人员应执行程序段,二类人员应执行程序段CLASS2CLASS2,十类人

39、员应执行程序段,十类人员应执行程序段CLASS10CLASS10TableClass1低位字节Class1高位字节Class10高位字节Class2高位字节Class10低位字节Class2低位字节Table+2Table+18(a) 地地 址址 跳跳 转转 表表Class1低位字节Class1高位字节Class10高位字节Class2高位字节Class10低位字节Class2低位字节Class1低位字节Class1高位字节Class10高位字节Class2高位字节Class10低位字节Class2低位字节Class1低位字节Class1高位字节Class10高位字节Class2高位字节Cla

40、ss10低位字节Class1低位字节Class1高位字节Class10高位字节Class2高位字节Class10低位字节Class1低位字节Class1高位字节Class10高位字节Class2高位字节Class10低位字节Class2低位字节( ) 地地 址址 跳跳 转转 表表CLASS10CLASS2CLASS1得到相应的分支程序段求表地址取分类号建立地址跳转表设置程序初始条件开始结束(b)CLASS10CLASS2CLASS2CLASS1得到相应的分支程序段求表地址取分类号建立地址跳转表设置程序初始条件开始结束(b)多路分支程序设计-程序DATA SEGMENT TABLE DW CLA

41、SS1,CLASS2,CLASS3,CLASS4,CLASS5 DW CLASS6,CLASS7,CLASS8,CLASS9,CLASS10NUM DB ?DATA ENDS STACK SEGMENT STACK DW 100 DUP(?)STACK ENDSCODE SEGMENT MAIN PROC FAR ASSUME CS :CODE,DS:DATA,SS:STACKSTART:PUSH DS SUB AX,AX PUSH AX MOV AX,DATAMOV DS,AXMOV AL,NUMMOV AH,0 SHL AXSUB AX,2LEA BX,TABLEADD BX,AX JMP

42、 BXCLASS1: CLASS2: CLASS10: RETMAIN ENDPCODE ENDS END START循环结构程序设计循环初始化循环体N循环控制部分Y图图4-6 先执行后判断循环结构先执行后判断循环结构循环体图图4-7 先判断后执行循环结构先判断后执行循环结构循环初始化NY循环控制部分循环结构程序设计-例*例例 把从把从BUFBUF单元开始的单元开始的8080个个1616位无符号数按从大到小的顺序排列位无符号数按从大到小的顺序排列 DSEG SEGMENT BUF DW 80 DUP(?)(?) DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:

43、DSEG START:MOV AX,DSEG MOV DS,AX LEA DI,MEM MOV BL,79 LOOP1:MOV SI,DI MOV CL,BLLOOP2:MOV AX,SI ADD SI,2 CMP AX,SI JNC NEXT MOV DX,SI MOV SI-2,DX MOV SI,AX NEXT: DEC CL JNZ LOOP2 DEC BL JNZ LOOP1MOV AH,4CH INT 21H CSEG ENDS END START子程序设计*例例 通过寄存器传递参数,将数据通过寄存器传递参数,将数据块块BUF1BUF1中的内容传递到数据块中的内容传递到数据块BUF2BUF2中中DATA SEGMENT BUF1 DB 11,22,33,99 CUNT EQU $-BUF1 BUF2 DB CUNT DUP(?)(?) DATA ENDS STACK SEGMENT TOS DW 128H

温馨提示

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

评论

0/150

提交评论