微型计算机原理及应用技术 第3版 教学课件作者 朱金钧汇编语言程序设计_第1页
微型计算机原理及应用技术 第3版 教学课件作者 朱金钧汇编语言程序设计_第2页
微型计算机原理及应用技术 第3版 教学课件作者 朱金钧汇编语言程序设计_第3页
微型计算机原理及应用技术 第3版 教学课件作者 朱金钧汇编语言程序设计_第4页
微型计算机原理及应用技术 第3版 教学课件作者 朱金钧汇编语言程序设计_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

1、微型计算机原理及应用技术微型计算机原理及应用技术第3版机械工业出版社朱金钧 麻新旗 等编著第2章5.1 宏汇编语言的根本语法 5.1.1 常数、变量和标号 5.1.2 运算符与表达式5.2 伪指令 5.2.1 伪指令语句的格式 5.2.2 常用伪指令5.3 宏指令5.4 汇编语言程序的结构 5.4.1 汇编语言程序的根本结构 5.4.2 汇编语言与DOS之间的接口5.5 DOS系统功能调用5.6 汇编语言程序的结构 5.6.1 汇编语言程序设计的步骤 5.6.2 汇编语言程序设计的根本方法 5.6.3 汇编语言程序设计综合实例 5.7 软件调试技术 5.7.1 调试软件DEBUG简介 5.7.

2、2 软件调试的根本方法8086微处理器及其系统汇编语言汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用符号或标号代表地址。使用汇编语言编写的程序称作汇编语言源程序。汇编语言源程序不能由机器直接执行而必须翻译成由机器代码组成的目标程序,这个过程称为汇编。把汇编语言源程序翻译成目标程序的软件称为汇编程序。 汇编过程的含义如图:汇编语言源程序目标程序汇编程序汇编宏汇编语言的根本语法5.1.1 常数、变量和标号5.1常数、变量和标号是汇编语言能识别的数据项,是指令和伪指令语句中操作数的基本组成部分,其大小和属性与机器语言代码生成有直接关系。 变 量标 号常 数常 数

3、 常数是没有任何属性的纯数值。在汇编期间,它的值已经完全确定,而且在程序的运行中也不会发生变化,它可以有以下几种类型:二进制数:以字母B结尾的由一串“0”和“1”组成的序列。例如:0010110B八进制数:以字母O或Q结尾,由若干个0到7的数字组成的序列。例如:255Q、377Q5.1.1 常数、变量和标号3. 十进制数:由若干个0到9的数字组成的序列,可以以字母D结尾,也可以省略字母。例如:1234D或1234 。4. 十六进制数:以字母H结尾,由若干个0到9的数字和字母A到F组成的序列,且必须以数字开头。例如: 56H,0B3FH5. 字符串常量:用引号括起来的一个或多个字符。这些字符以A

4、SCII码形式存在内存中。例如:“A”的值是41H, “ B”的值是42H变 量变量通常是存放在某些存储单元的数据,这些数据在程序运行期间可以修改。变量使用数据定义伪指令DB、DW、DD等定义的。经过定义的变量,每个变量均有三个属性:段属性(SEGMENT)表示变量存放在哪一个逻辑段中(即变量所在段的段地址)。5.1.1 常数、变量和标号偏移属性(OFFSET)表示变量的偏移地址,即在逻辑段中距段的起始点的字节数。类型属性(TYPE)表示变量占用存储单元的字节数。用DB定义的变量类型属性为字节;用DW定义的变量类型属性为字(2字节);用DD定义的变量类型属性为双字(4字节)标 号标号表示一条指

5、令所在的地址,所以标号也是指令语句的地址符号,常用作转移指令包含子程序调用指令的操作数,即目标地址。标号通常由字母数字串组成,但第一个字母必须为字母。标号有三种属性:段属性(SEGMENT)表示标号所在段的段基址。5.1.1 常数、变量和标号2. 偏移属性(OFFSET)表示标号的偏移地址,即标号地址在逻辑段中距段的起始点的字节数。3. 距离属性(或类型属性 TYPE)表示标号作为段内或段间的转移属性。表达式与运算符8086宏汇编语言允许使用的表达式有两种类型:只产生数值结果。数值表达式它所产生的结果是一个存储器地址,如果这个地址存放的是数据,一般称它为变量,如果存放的是指令,一般称它为标号。

6、地址表达式算术运算符例5-1 CONT = 15*4 ; CONT =60 CONT = CONT /8 ; CONT =7 CONT = CONT MOD 3 ; CONT =1 MOV AL, 21H SHL 2 ; AL = 84H包括加+、减-、乘*、除/、求余数MOD、左移SHL和右移SHR表达式与运算符 除了加和减法运算符可以使用变量和符号外,其他运算符只适用于常数的数值运算。注意逻辑运算符例5-2 AND DX, PORT AND OFEH 其中第二个AND是逻辑运算符,在程序汇编时,计算PORT AND OFEH 产生一个立即数作为指令操作数。而第一个AND是指令助记符,在汇编

7、以后执行AND指令,DX的内容与上述立即数相“与”,结果放在DX中。包括按位操作的与AND、或OR、异或XOR、和非NOT四种运算符。它们只适用于对常数进行逻辑运算。表达式与运算符 AND、OR、XOR和NOT也是指令助记符。注意关系运算符例5-4 MOV BX, (PORT LT 5) AND 20) OR (PORT GE 5) AND 30) 此例中当 PORT 的值小于5时,执行 MOV BX,20 否则执行MOV BX,30。例5-3 MOV BX, PORT LT5 若 PORT的值小于5,则汇编程序把上条指令汇编为:MOV BX,OFFFFH; 否则被汇编为:MOV BX,0。包

8、括EQ相等、NE不相等、LT小于、GT大于、LE小于或大于、GE大于或等于共六种。表达式与运算符分析操作符数值返回运算符(1)取地址的偏移量格式: OFFSET 变量名或标号功能:取变量名或标号所在段的段内偏移量。格式:TYPE 变量名或标号功能:返回一个数字值。若TYPE运算符加在变量名前,返回的数值是该变量的类型属性;若TYPE运算符加在标号前,返回的数值则是该变量距离属性;返回的数值与性的关系表4-1。求变量名或标号的类型值(3)(2)取段基址格式: SEG 变量名或标号功能:取变量名或标号所在段的段地址。表达式与运算符标号/变量属性类型值 字节变量 BYTE1 字变量 WORD 2 双

9、字变量 DWORD4 标号 NEAR-1 标号 FAR-2表5-1 存储器操作数的类型值表达式与运算符分析操作符数值返回运算符综合运算符(1)PTR 运算符格式:类型 PTR 表达式功能:用于指出变量、标号或地址表达式的类型属性,新的类 型只在当前指令内有效。表达式与运算符2 THIS 运算符格式:THIS 类型功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址 表达式。其他运算符例5-9 K1 EQU 1234H MOV AL,LOW K1 ;AL 34HMOV BL,HIGH K1 ;BL 12H表达式与运算符(1)HIGH 和 LOW 运算符格式:HIGH 表达式 LOW 表达

10、式功能:从运算对象中分理处高字节或低字节。2 SHORT 运算符格式:SHORT 标号功能:当转移的目标地址与本转移指令的下一条指令之间的字 节距离在 128 127 范围时,可以用SHORT运算符进行 说明。例5-10L1: JMP SHORT L2 L2: MOV AX,BX 表5-2 运算符的优先级别SHORT10OR , XOR9AND8NOT7EQ , NE , LT , LE , GT , GE6+ 、-5* , / , MOD , SHL , SHR4HIGH , LOW 3PTR , OFFSET , SEG , TYPE , THIS , 段前缀(段寄存器名)2LENGTH

11、, SIZE , WIDTH , MASK1括号中的表达式0 高低运算符优先级别表达式与运算符伪指令5.2.1 伪指令语句的格式 定义符字段 在伪指令语句中,定义符表示该语句的伪操作功能。定义符有汇编程序规定,宏汇编程序中使用了数十种定义符。5.2 符号名字段 符号名用在伪指令语句的前面,用空格和定义符隔开。 操作数字段 操作数可以是常数二进制、十进制、十六进制等、字符串、常量名、变量名、标号和一些专用符号等。伪指令语句的格式为:符号名 定义符 操作数;注释 注释字段 这是一个任选字段,它必须以分号开始,和指令语句的注释功能一样。常用伪指令例5-11ALFA EQU 100COUNT EQU

12、ALFA1. 符号定义伪指令赋值语句(1)等值伪指令 格式:符号名 EQU 表达式 功能:将表达式的值赋给符号名。例5-12ALFA = 100MOV AL,ALFA ;AL100ALFA = ALFA+2 ;ALFA = 102MOV AL,ALFA ;AL102(2)等号伪指令 格式:符号名 = 表达式 功能:将表达式的值赋给符号名 等号伪指令可以在程序中不同的地方多次使用以重新为符号 名赋值。例5-13BARY LABEL WORD ;定义BARY为字类型 ADD AX,BARY ;字加法ABCF LABEL FAR ;ABCF为FAR类型标号(3)定义符号名和伪指令格式:符号名 LAB

13、EL 类型功能:定义一个标号或变量,并指定其类型。常用伪指令1. 符号定义伪指令赋值语句数据定义伪指令2. 格式: 变量名 DB 表达式 ;定义字节 变量名 DW 表达式 ;定义字 变量名 DD 表达式 ;定义双字 变量名 DQ 表达式 ;定义8个字节 变量名 DT 表达式 ;定义10个字节常用伪指令 表达式是赋给变量的初始值,可以有一个,也可以有多个,常见的有以下几种:这实际上是为数据分配存储单元,并把变量名作为该存储单元的名称。1数值表达式常用伪指令数据定义伪指令2. DW伪指令可以为两个字符组成的字符串分配一个字单元。2 ASCII字符串可以用DB伪指令为ASCII字符串中的每一个字符分

14、配一个字单元。3 ?表达式 这是为数据项分配存储单元的一种方法,只是存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。4重复定义子句DUP利用重复定义子句DUP可以为假设干个重复数据分配存储单元。段定义伪指令 段定义伪指令用于将源程序划分成假设干段,这些逻辑段按用途可分为代码段用于存放程序、数据段用于存放数据、堆栈段用于堆栈操作和附加段附加的数据段。需要说明的是,并不是所有的程序都必须包含这四个逻辑段,有时只需要一个段或两个段。功能:把模块划分为假设干个逻辑段。每个SEGMENT/ENDS可定义一个逻辑段。3.格式:段名 SEGMENT 定位类型组合类型类别名 段名

15、ENDS 常用伪指令段存放器说明伪指令4.格式:ASSUME 段寄存器 :段名,段寄存器 :段名功能:向汇编程序指示当前各段所用的段寄存器,设定段寄存器与段的对应关系。常用伪指令过程定义伪指令过程是程序的一局部,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成的。5.格式: 过程名 PROC NEAR / FAR 过程体 RET 过程名 ENDP功能:完成过程定义,在过程体中实现过程的操作功能 模块定义及通信伪指令汇编语言可以把程序划分成许多模块,并对每个模块独立地进行汇编和调试。(1) 模块开始伪指令6.格式:NAME 模块

16、名功能:指明程序模块的开始,并指出模块名。常用伪指令(2)模块结束伪指令源程序结束伪指令格式:END 启动标号或过程名功能:END表示一个模块的结束。通知汇编程序源程序到此结束,并给出执行程序的入口位置。(3)定义公共符号名伪指令格式: PUBLIC 符号名,符号名可以是变量、符号常量、标号或过程名。功能:由PUBLIC定义的符号名,可以被其他模块引用,即由其定义的符号名是公共符号名,可以被外部模块引用。 常用伪指令模块定义及通信伪指令6.定义外部符号名伪指令(4)格式:EXTRN 符号名:类型, 符号名在其他模块中已由PUBLIC所定义。类型指的是符号名的 类型,符号名的类型应与原模块中定义

17、的类型一致。它们可以是: 内存变量型:BYTE、WORD、DWORD 过程型:NEAR、FAR 数值型:ABS功能:定义本模块中将要引用的外部模块中的符号名,它们应在各自 的模块中已用PUBLIC伪指令进行了定义。列表伪指令(1) 格式控制伪指令格式控制伪指令用于对源程序排版、加标题和子标题。 7.常用伪指令(2)列表控制伪指令格式: . LIST . XLIST % OUT 功能: . LIST 用于打开列表文件的输出。 . XLIST用于关闭列表文件的输出。 % OUT 可在汇编时显示接在其后的信息,以便了解汇编 的过程。 8.记录伪指令(1) 记录定义【例5-23】 表示一个学生情况的记

18、录,设年龄占5位,性别占1位(1:男,0:女),身体状况占2位(00:健康,01:良好,10:一般,11:差),可定义为: STDRC RECORD YER:5,SEX:1=0,STT:2记录名、字段名必须存在,不可使用默认值。各字段总和不能超过16位。表达式的初值应取正整数。注意格式:记录名 RECORD 字段名:宽度=表达式 ,功能:用于定义一个记录。指明记录中字段的位长度及初值,并用记录名表示已定义的记录。 常用伪指令(2)记录存储单元分配及赋值【例5-24】 TAN RECORD X:6,Y:4,Z:6AP TAN BP TAN 字段值表中缺省项的默认值为0。注意此例在存储器中分配两个

19、记录,每个记录为两个字节。格式:记录变量名 记录名 功能:将字段值表中的各字段值赋给记录的各字段。常用伪指令8.记录伪指令记录操作符1)取字段宽度操作符【例5-25】 MOV AL,WIDTH YER ;AL5MOV BH,WIDTH SEX ;BH1MOV AH,WIDTH STDRC ;AH8(3)格式:WIDTH 记录名或记录字段名功能:用于返回该记录或记录字段的宽度(二进制位数)。常用伪指令8.记录伪指令2)取字段位置操作符【例5-26】 MOV BL,MASK YER ;BL11111000MOV AH,MASK SEX ;AH00000100格式: MASK 字段名功能:返回一个8

20、位或16位的二进制数。该字段所在的位为1,其他位为0,以确定该字段在记录中所在的字段的位置。常用伪指令记录操作符(3)8.记录伪指令结构伪指令结构伪指令是把多个数据定义语句组成一个结构,而把每一个数据定义语句称为一个结构字段,内存变量名称为字段名。(1) 结构定义伪指令【例5-27】 ABC STRUCA DB ?B DB ABC12C DW 120ABC ENDS9.格式:结构名 STRUC 字段名 数据定义语句 结构名 ENDS 功能:定义一个结构。它含有由数据定义语句所确定的数据结构,并引用结构名来代表这种结构。 常用伪指令条件汇编伪指令条件汇编的主要作用是根据条件有选择地对程序汇编。1

21、0.一般格式:IF 表达式 程序段1 ELSE 程序段2 ENDIF功能:当条件为真时,对程序段1进行汇编,如有ELSE及程序段 2则跳过;当条件为假时,跳过程序段1,对程序段2进行汇 编(若有ELSE及程序段2)。常用伪指令常用伪指令(1) 定位伪指令【例5-31】 ORG 0100H ;从0100H开始存放 ORG $ + 20 ;$为当前地址,从此地址后20字节处开始存放(2) 注释说明伪指令格式:COMMENT 定界符 注释 定界符功能:用于在程序中加入注释,即定界符间的内容全部为注释。格式:ORG 数值表达式功能:指定在它之后的程序段或数据块所存放的起始地址的偏移量。11. 其他伪指

22、令当无ORG伪指令时,从段首址开始存放程序或数据。注意宏指令 为了简化汇编语言源程序,可以把一些频繁出现的程序段 定义为“宏指令1. 宏定义及其调用5.3宏定义的一般格式为:宏指令名 MACRO 形参,形参, 宏体 ENDM2.带参数的宏【例5-35】 SHIFT MACRO X MOV CL,X SAL AL,CL ENDM X是一个形式参数,这里代表移位次数。在调用时,可把实际要求的移位次数作为实际参数代入,如SHIFT 4,就可用实在参数4代替在宏定义体中出现的形式参数X,从而实现移位4次。假设再引用一个形式参数:SHIFT MACRO X,Y MOV CL,X SAL Y,CL END

23、M用形式参数Y来代替需要移位的存放器,只要在调用时,把要移位的存放器作为实际参数代入,就可以对任一个存放器实现指定的左移操作。宏指令5.33.主要的宏操作伪指令1 宏定义伪指令2 取消宏指令名伪指令3 重复伪指令格式: 宏指令名 MACRO 形参,形参, 宏体 ENDM格式: REPT (表达式) 宏体 ENDM功能:重复执行若干次宏体所包含的语句。其中执行的次数 由表达式的值决定。格式: PURGE 宏指令名 ,功能:用于注销若干宏定义。宏指令 汇编语言源程序的结构DATA SEGMENT DATA ENDSSTACK SEGMENT PARA STACK STACK STA

24、CK ENDSCODE SEGMENTASSUME CS:CODE, SS:STACK,DS: DATA,ES:DATASTART: MOV AX,DATAMOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV AH,4CH INT 21H PRAPROC NEAR PRAENDP CODE ENDS END START汇编语言程序的结构5.4汇编语言和DOS操作系统之间的接口正常返回DOS的方法如下:CODE SEGMENT START PROC FAR PUSH DS;保护PSP段地址 MOV AX,0;保护偏移0地址PUSH AX RETSTART

25、ENDPCODE ENDS END START还有一种非标准返回DOS的方法,即在CODE ENDS之前插入: MOV AH, 4CH INT 21HDOS系统功能调用5.5INT 21H中断本身包含很多子程序,每个子程序对应一个功能,其编号从062H。调用它们时采用统一的格式如下: 传送入口参数到指定寄存器中; 功能号送入AH寄存器; INT 21H。 MSDOS中常用的软中断有8条,系统规定它们的中断类型码为20H27H,它们各自的功能及入口/出口参数见表4-3。1. 键盘输入单字符1号系统功能调用使用格式如下: MOV AH,1 INT 21HDOS系统功能调用5.52. 无回显键盘输入

26、单字符8号系统功能调用 使用格式如下: MOV AH,8 INT 21H3无回显直接控制台输入单字符7号系统功能调用 使用格式如下: MOV AH,7 INT 21H4. 键盘输入字符串0AH号系统功能调用 BUF DB20;定义缓冲区长度DB?;由系统填写实际键入字符数DB20 DUP(?);用于存放键入的字符,最多可键入19 ;个字符,最后一个必须是回车符0DH MOV DX,OFFSET BUFMOV AH,0AHINT 21H;0AH号系统功能调用 4. 键盘输入字符串0AH号系统功能调用 BUF DB20;定义缓冲区长度DB?;由系统填写实际键入字符数DB20 DUP(?);用于存放

27、键入的字符,最多可键入19 ;个字符,最后一个必须是回车符0DH MOV DX,OFFSET BUFMOV AH,0AHINT 21H;0AH号系统功能调用 DOS系统功能调用5.5使用格式如下: MOV DL,A MOV AH,2 INT 21H5. 输出单字符2号系统功能调用DOS系统功能调用5.56. 输出字符串9号系统功能调用BUF DB GOOD BYE MOV DX,OFFSET BUF MOV AH,9 INT 21H ;在显示器屏幕上显示GOOD ;BYE 如果DL=0FFH,则表示是从键盘输入单字符送AL寄存器;如果DL0FFH,则表示是将DL寄存器中的内容送屏幕显示输出。它

28、们的使用格式如下: MOV DL,0FFHMOV AH,6INT 21H ;键盘输入单字符送ALMOV DL,AMOV AH,6 INT 21H ;将DL中的字符A送屏幕显示 7.直接控制台输入/输出单字符6号系统功能调用DOS系统功能调用5.5使用格式如下: MOV AH,4CH INT 21H它没有入口参数,执行结果是结束当前正在执行的程序,并返回DOS操作系统。8.返回操作系统4CH号系统功能调用DOS系统功能调用5.59.从串口输入单字符3号系统功能调用10. 向串口输出单字符4号系统功能调用使用格式如下: MOV AH,3INT 21H它没有入口参数,系统将从异步通信口串行输入的字符

29、置入AL寄存器中。使用格式如下: MOV DL, MOV AH,4INT 21H执行时将DL寄存器中的字符通过异步通信口串行输出。为节省篇幅,不再赘述其他的系统功能调用,需要时请参阅附录B。 DOS系统功能调用5.5汇编语言程序设计5.6.1 程序设计步骤程序是计算机命令的有序集合,用计算机求解某些问题时往往需要编制程序,其设计步骤归纳如下:5.6(1)分析问题 (2) 建立数学模型 (3) 确定算法 (4) 绘制程序流程图(5) 内存空间分配(6) 编制程序与静态检查(7) 程序调试汇编语言程序设计方法1. 简单程序设计简单程序,又称为顺序程序。这种程序的形式最简单,计算机执行程序的方式是“

30、从头到尾,逐条执行指令语句,直到程序结束,这是最根本的形式,任何程序都离不开这种形式。在汇编语言程序中简单程序主要由数据传送指令、算术运算指令和逻辑运算指令组合而成。 DATA SEGMENT X DW 5 RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,5 MUL X ADD AX,4 MUL X SUB AX,3 MUL X ADD AX,2 MOV RESULT,AX MOV AH,4CH INT 21H CODE ENDS END START汇编

31、语言程序设计方法2. 分支程序设计分支程序可以有两种形式:简单分支结构和多分支结构。其中简单分支结构有两种,相当于高级语言中的IFTHEN和IFTHENELSE结构;多分支结构那么相当于高级语言中的DO-CASE结构。它们的流程图如图4-3所示。【例5-37】 比较两个无符号数的大小。 在A和B单元各有一个8位无符号数,要求比较这两个无符号数,并根据比较结果在屏幕上显示AB或BA假设这两个数不相等。(1)简单分支程序设计分析:首先使用比较指令比较两个无符号数的大小,然后根据标志位, 使用无符号数转移指令实现转移。其程序流程图如图5-4所示。 汇编语言程序设计方法2. 分支程序设计【例5-37】

32、 比较两个无符号数的大小。 DATA SEGMENT A DB 20H B DB 92H DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,A CMP B,AL JA BGA MOV DL,A MOV BL,B JMP DISP BGA: MOV DL,B MOV BL,A DISP: MOV AH,2 INT 21H MOV DL, INT 21H MOV DL,BL INT 21H MOV AH,4CH INT 21H CODE ENDS END START 简单分支程序设计汇

33、编语言程序设计方法2. 分支程序设计【例5-38】 某应用程序主菜单有8个可选项,其入口地址分别记为R0、R1 R7。要求编制程序根据变量N的值转向相应的处理程序N为入口编号。 DATA SEGMENT BASE DW R0,R1,R2,R3 DW R4,R5,R6,R7 N DB 5 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,N ADD AL,AL MOV AH,0 MOV BX,OFFSET BASE ADD BX,AX MOV AX,BX JMP AX R0: JMP

34、 OK R1: JMP OK R7: OK: MOV AH,4CH INT 21H CODE ENDS END START 多分支程序设计3.(1) 循环程序的结构与组成循环程序设计2)循环工作局部 又称为循环体,是循环结构的根本局部,完成实际的处 理操作。 3)循环控制局部 循环控制局部用于控制重复执行的次数。包括修改变量、 修改指针,为下一次循环做准备,以及修改循环计数器, 判断循环结束条件是否满足,假设条件满足那么退出循环, 否那么继续循环。 4)循环结束局部 主要用来分析和存放程序的结果。 循环的初始化部分 建立循环初始值,如初始化地址指针、计数器以及其他 循环参数的起始值等。汇编语言

35、程序设计方法3.循环程序设计(2) 循环控制方法汇编语言程序设计方法 计数法【例5-39】统计负数个数并显示。 DATA SEGMENT BUF DB 2,-1,56 COUNT EQU 20 NEGA DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,OFFSET MOV DL,0 MOV CX,COUNT LP: MOV AL,SI AND AL,AL JNS NEXT INC DL NEXT:INC SI LOOP LP MOV NEGA,DL OR DL,30H

36、MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START 3.循环程序设计(3) 多重循环设计多重循环程序时,可以从外层循环到内层循环一层一层的进行。通常在设计外层循环时,仅把内层循环看成一个处理粗框,然后再将粗框细化,分成初始化、工作、控制、结束四个组成局部。当内层循环设计完毕以后,用其替换外层循环体中被视为处理粗框的对应局部,就构成了一个多重循环程序。 汇编语言程序设计方法虽然多重循环程序可以嵌套,但不能交叉。此外,转移指令可以从循环结构内转出,但一般不要从外循环直接跳进内循环。特别要注意的是,不要使循环回到初始化部分,这样可能会出现死

37、循环。 注意子程序设计子程序相对主程序而言,是一个子的程序段,确切地说,它是被主程序调用的程序。子程序调用示意图如图5-8所示。图5-8 子程序调用示意图子 主b子 主a子1子2 主c子1子2 主d4.汇编语言程序设计方法一般来说有公用性、重复性或有相对独立性的程序段应设计成子程序。这种结构给程序设计带来了许多方便。(2) 子程序设计应注意的问题 子程序名 功能、技术指标(如执行时间等) 入口参数、出口参数 嵌套哪些子程序 1) 现场保护和恢复。2) 参数传递。3) 子程序说明。(1)子程序调用和返回汇编语言程序设计方法用CALL和RET指令来实现子程序的调用和返回,CALL指令在主程序中,R

38、ET指令通常在子程序末尾。(3)子程序调用技巧1) 子程序嵌套子程序调用子程序的过程称为子程序嵌套,如图5-8d所示。2) 子程序递归子程序调用自身的过程称为递归,如图5-9a所示。3) 可重入子程序子程序被调用后没有执行完又被另一程序重复调用称为可重入子程序。一般用于多用户系统如图4-9b所示。4) 协同子程序两个以上子程序协同完成同一任务,且相互调用,直到任务结束。汇编语言程序设计方法图4-9 子程序递归和重入示意图主子a子程序主程序1主程序2b汇编语言程序设计方法(3)子程序调用技巧程序设计举例前面已经介绍了程序设计的根本方法。本节将给出一些程序设计的例子,这些例子涉及一些常用程序,通过

39、这些例子可以掌握一些程序设计的技巧和方法。1. 算术运算程序【例5-44】 多字节压缩型十进制数加法。分析:压缩型十进制数即用压缩型BCD码表示的十进制数。 因为是多字节数,所以可以用循环程序来完成加法 运算。每次循环完成一个字节的加法。需要注意的 是, 相加之后必须使用压缩BCD码加法调整指令 DAA进行十进制调整。非数值处理程序非数值处理即处理数值以外的数据,如字符、字符串、代码、记录和表格等。非数值处理程序有很多,主要有:代码转换、字符处理、表处理等。(1) 代码转换1) BCD码与ASCII码间的相互转换。2.程序设计举例【例5-45】从A单元开始存有10个字节的压缩BCD码,要求 编

40、程将其转换为ASCII码并显示在CRT上。 分析:压缩型BCD码要转换为ASCII码应该首先利用SHR 指令将高4位移至低4位的位置上,然后转换为 ASCII码送入DL,用2号调用显示;其次利用AND 指令将原数的高4位清零,然后也转换为ASCII码 送入DL,用2号调用显示。非数值处理程序2.程序设计举例【例5-45】压缩BCD码转换为ASCII码。 DATA SEGMENT A DB 34H,68H, N EQU $-ADATA ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AX,STAC

41、K MOV SS,AX LEA BX,A MOV CX,N LP: MOV AL,BX MOV DH,AL PUSH CX MOV CL,4 SHR AL,CL POP CX OR AL,30H MOV DL,AL MOV AH,2 INT 21H AND DH,0FH OR DH,30H MOV DL,DH INT 21H MOV DL, INT 21H INC BX LOOP LP MOV AH,4CH INT 21HCODE ENDS END START非数值处理程序非数值处理即处理数值以外的数据,如字符、字符串、代码、记录和表格等。非数值处理程序有很多,主要有:代码转换、字符处理、表处

42、理等。(1) 代码转换2) 二进制数到七段显示码的转换。2.程序设计举例图5-11 七段显示器及其显示码表18H00H78H02H12H19H30H24H79H40H码9876543210数D0D1D2D3D4D5D60gaabef不用gdccbdefa) 外形图b) 各段与字节各位的对应关系c) 十进制数于七段显示码的关系表程序设计举例非数值处理程序2.(1) 代码转换非数值处理程序【例5-46】二进制数到七段显示码的转换。2.程序设计举例 DATA SEGMENT A DB 34H,68H, N EQU $-A DATA ENDS CODE SEGMENT ASSUME CS: CODE,

43、 DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA BX,A MOV CX,N LP: MOV AL,BX MOV DH,AL PUSH CX MOV CL,4 SHR AL,CL POP CX OR AL,30H MOV DL,AL MOV AH,2 INT 21H AND DH,0FH OR DH,30H MOV DL,DH INT 21H MOV DL, INT 21H INC BX LOOP LP MOV AH,4CH INT 21HCODE ENDS END START(2)字符数据处理 (3) 表处理字符和

44、字符串的处理是计算机应用的一个重要方面。字符数据处理一般包括统计、比较、删除、插入等。表格是软件最根本的数据结构。表格中可以存放一系列相关联的数据及执行结果,可供运算和查询。程序设计举例【例5-48】数据或程序的加密。 从键盘上输入一个09之间的数字,将其加密后存入MIMA单元。 分析:为了使数据能够保密,可以建立一个密码表,利用换码 指令将数据加密。比如,可以选择密码为: 原数字:0,1,2,3,4,5,6,7,8,9 密码字:2,9,4,6,3,0,7,8,5,1 (3) 表处理程序设计举例【例5-48】数据或程序的加密。 DATA SEGMENT MITAB DB 2946307851

45、JMITAB DB 5904283671 MIMA DB? DATA ENDS STACK SEGMENT PARA STACK STACKSTT DB100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AH,1 INT 21H AND AL,0FH LEA BX,MITAB XLAT MOV MIMA,AL DONE:MOV AH,4CH INT 21HCODE ENDS END START软件调试技术5

46、.7.1 调试软件DEBUG简介DEBUG调试软件是专为汇编语言设计的一种调试工具,具有跟踪程序执行、观察运行中间结果、显示和修改存放器或存储单元内容等多项功能,是开发汇编语言程序所必须掌握的调试手段。 5.7在操作系统环境下,启动DEBUG后将进入DEBUG的命令状态,在此状态下,可以使用DEBUG的任何命令,每个命令均以回车结尾。 在DEBUG状态下,所有地址、数据均以无后缀的16进制表示,如:123F、F0AA等。注意DEBUG命令中的“地址和“地址范围 :5.7.1 调试软件DEBUG简介地址表示形式 段存放器名:相对地址 例:DS:100或 段地址:相对地址 例:24AB:1000或

47、 相对地址 例:1000地址范围表示: 起始地址 结束地址 或 起始地址 L表示字节数 常用DEBUG命令1. 显示存储单元内容 5.7.1 调试软件DEBUG简介 格式1:D 起始地址 格式2:D 地址范围2修改存储单元内容 格式1:E 起始地址 列表 格式2:E 地址 3显示、修改存放器内容 格式:R 存放器名 4. 运行命令 格式:G =起始地址 第一断点地址 第二断点地址5. 跟踪命令 格式:T =起始地址 正整数 6. 汇编命令 5.7.1 调试软件DEBUG简介 格式:A 起始地址 7. 反汇编命令 格式1:U 起始地址 格式2:U 地址范围 8. 指定文件名命令 格式:N 文件名

48、及扩展名 9. 装入命令 格式1:L 起始地址 驱动器号 起始扇区 扇区数 格式2:L 起始地址10.写磁盘命令 格式1:W 起始地址 驱动器号 起始扇区 扇区数 格式2:W 起始地址 11. 退出命令 格式:Q 5.7.2 软件调试的根本方法利用调试软件DEBUG装入二进制执行程序,通过连续运行、分段运行、单步运行,可以实现软件剖析、查错或修改。 将.COM文件装入后,指令指针IP置成100H,即程序入口的相对地址。首先从此处开始连续运行,考察程序的功能是否到达。如果出错,那么可用分段运行方式,缩小错误所在程序段的范围,然后,再用单步方式找出错误确切所在处。 对 .EXE类型文件的调试与上相

49、似,但不能直接用DEBUG存盘命令存盘。 用DEBUG调试程序需要注意以下几点:5.7.2 软件调试的根本方法设有程序EXAMP.COM,调试方法如下: 在此期间如果出现问题,就说明这些指令中有错误,这时,可用单步逐条执行,如: -T =100 执行这一条指令后,会显示通用存放器、段存放器、标志存放器的内容。由此可分析出本条指令的执行结果是否正确。假设正确,那么执行下一条指令;否那么进行必要的修改。 CDEBUG EXAMP.COM -G 可以先用上述命令连续执行程序,如果结果不正确或死机,应该使用分段方式运行,查看问题出现在哪里,此时可用到T命令或G命令。 -T =100,5 或 G 断点 前者从相对地址为100H开始执行EXAMP.COM,连续执行5条指

温馨提示

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

最新文档

评论

0/150

提交评论