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

下载本文档

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

文档简介

微型计算机原理及应用技术微型计算机原理及应用技术第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.5DOS系统功能调用5.6汇编语言程序的结构5.6.1汇编语言程序设计的步骤5.6.2汇编语言程序设计的基本方法5.6.3汇编语言程序设计综合实例

5.7软件调试技术

5.7.1调试软件DEBUG简介5.7.2软件调试的基本方法8086微处理器及其系统第2章5.1宏汇编语言的基本语法5.5DOS系统功能调用汇编语言汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用符号或标号代表地址。使用汇编语言编写的程序称作汇编语言源程序。汇编语言源程序不能由机器直接执行而必须翻译成由机器代码组成的目标程序,这个过程称为汇编。把汇编语言源程序翻译成目标程序的软件称为汇编程序。

汇编过程的含义如图:汇编语言源程序目标程序汇编程序汇编汇编语言汇编语言是一种采用助记符表示的程序设计语言,即用助记宏汇编语言的基本语法5.1.1常数、变量和标号5.1常数、变量和标号是汇编语言能识别的数据项,是指令和伪指令语句中操作数的基本组成部分,其大小和属性与机器语言代码生成有直接关系。

变量标号常数宏汇编语言的基本语法5.1.1常数、变量和标号5.1常数常数

常数是没有任何属性的纯数值。在汇编期间,它的值已经完全确定,而且在程序的运行中也不会发生变化,它可以有以下几种类型:二进制数:●以字母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.字符串常量:●用引号括起来的一个或多个字符。这些字符以ASCII码形式存在内存中。例如:“A”的值是41H,“B”的值是42H常数常数是没有任何属性的纯数值。在汇编期间,它的值已经完变量●变量通常是存放在某些存储单元的数据,这些数据在程序运行期间可以修改。变量使用数据定义伪指令DB、DW、DD等定义的。经过定义的变量,每个变量均有三个属性:段属性(SEGMENT)●表示变量存放在哪一个逻辑段中(即变量所在段的段地址)。5.1.1常数、变量和标号偏移属性(OFFSET)●表示变量的偏移地址,即在逻辑段中距段的起始点的字节数。类型属性(TYPE)●表示变量占用存储单元的字节数。用DB定义的变量类型属性为字节;用DW定义的变量类型属性为字(2字节);用DD定义的变量类型属性为双字(4字节)变量●变量通常是存放在某些存储单元的数据,这些数据在程序运标号●标号表示一条指令所在的地址,所以标号也是指令语句的地址符号,常用作转移指令(包含子程序调用指令)的操作数,即目标地址。●标号通常由字母数字串组成,但第一个字母必须为字母。标号有三种属性:段属性(SEGMENT)●表示标号所在段的段基址。5.1.1常数、变量和标号2.偏移属性(OFFSET)●表示标号的偏移地址,即标号地址在逻辑段中距段的起始点的字节数。3.距离属性(或类型属性TYPE)●表示标号作为段内或段间的转移属性。标号●标号表示一条指令所在的地址,所以标号也是指令语句的地表达式与运算符8086宏汇编语言允许使用的表达式有两种类型:5.1.2只产生数值结果。数值表达式它所产生的结果是一个存储器地址,如果这个地址存放的是数据,一般称它为变量,如果存放的是指令,一般称它为标号。地址表达式表达式与运算符8086宏汇编语言允许使用的表达式有两种类型:算术运算符[例5-1]CONT=15*4;CONT=60CONT=CONT/8;CONT=7CONT=CONTMOD3;CONT=1MOVAL,21HSHL2;AL=84H●包括加(+)、减(-)、乘(*)、除(/)、求余数(MOD)、左移(SHL)和右移(SHR)表达式与运算符5.1.2●除了加和减法运算符可以使用变量和符号外,其他运算符只适用于常数的数值运算。注意算术运算符[例5-1]CONT=15*4逻辑运算符[例5-2]ANDDX,PORTANDOFEH其中第二个AND是逻辑运算符,在程序汇编时,计算PORTANDOFEH产生一个立即数作为指令操作数。而第一个AND是指令助记符,在汇编以后执行AND指令,DX的内容与上述立即数相“与”,结果放在DX中。●包括按位操作的与(AND)、或(OR)、异或(XOR)、和非(NOT)四种运算符。它们只适用于对常数进行逻辑运算。表达式与运算符5.1.2●AND、OR、XOR和NOT也是指令助记符。注意逻辑运算符[例5-2]ANDDX,POR关系运算符[例5-4]

MOVBX,((PORTLT5)AND20)OR((PORTGE5)AND30)此例中当PORT的值小于5时,执行MOVBX,20否则执行MOVBX,30。[例5-3]MOVBX,PORTLT5若PORT的值小于5,则汇编程序把上条指令汇编为:MOVBX,OFFFFH;否则被汇编为:MOVBX,0。●包括EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或大于)、GE(大于或等于)共六种。表达式与运算符5.1.2关系运算符[例5-4][例5-3]MOV分析操作符(数值返回运算符)(1)取地址的偏移量格式:OFFSET变量名或标号功能:取变量名或标号所在段的段内偏移量。格式:TYPE变量名或标号功能:返回一个数字值。若TYPE运算符加在变量名前,返回的数值是该变量的类型属性;若TYPE运算符加在标号前,返回的数值则是该变量距离属性;返回的数值与性的关系表4-1。求变量名或标号的类型值(3)(2)取段基址格式:SEG变量名或标号功能:取变量名或标号所在段的段地址。表达式与运算符5.1.2分析操作符(数值返回运算符)(1)取地址的偏移量格式:TYP标号/变量属性类型值字节变量BYTE1字变量WORD2双字变量DWORD4标号NEAR-1标号FAR-2表5-1存储器操作数的类型值表达式与运算符5.1.2分析操作符(数值返回运算符)标号/变量属性类型值字节变量综合运算符(1)PTR运算符格式:类型PTR表达式功能:用于指出变量、标号或地址表达式的类型属性,新的类型只在当前指令内有效。表达式与运算符5.1.2(2)THIS运算符格式:THIS类型功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址表达式。综合运算符(1)PTR运算符表达式与运算符5.1.2(2)其他运算符[例5-9]

K1EQU1234HMOVAL,LOWK1;AL←34HMOVBL,HIGHK1;BL←12H表达式与运算符5.1.2(1)HIGH和LOW运算符格式:HIGH表达式

LOW表达式功能:从运算对象中分理处高字节或低字节。(2)SHORT运算符格式:SHORT标号功能:当转移的目标地址与本转移指令的下一条指令之间的字节距离在–128~127范围时,可以用SHORT运算符进行说明。[例5-10]L1:JMPSHORTL2┇L2:MOVAX,BX┇其他运算符[例5-9]表达式与运算符5.1.2(1)HIG表5-2运算符的优先级别SHORT10OR,XOR9AND8NOT7EQ,NE,LT,LE,GT,GE6+、-5*,/,MOD,SHL,SHR4HIGH,LOW3PTR,OFFSET,SEG,TYPE,THIS,段前缀(段寄存器名)2LENGTH,SIZE,WIDTH,MASK1括号中的表达式0高低运算符优先级别表达式与运算符5.1.2表5-2运算符的优先级别SHORT10OR,XOR9伪指令5.2.1伪指令语句的格式●定义符字段在伪指令语句中,定义符表示该语句的伪操作功能。定义符有汇编程序规定,宏汇编程序中使用了数十种定义符。5.2●符号名字段符号名用在伪指令语句的前面,用空格和定义符隔开。●操作数字段操作数可以是常数(二进制、十进制、十六进制等)、字符串、常量名、变量名、标号和一些专用符号等。伪指令语句的格式为:符号名定义符操作数;注释●注释字段这是一个任选字段,它必须以分号开始,和指令语句的注释功能一样。伪指令5.2.1伪指令语句的格式●定义符字段5.2●常用伪指令[例5-11]ALFAEQU100COUNTEQUALFA1.符号定义伪指令(赋值语句)5.2.2(1)等值伪指令格式:符号名EQU表达式功能:将表达式的值赋给符号名。[例5-12]ALFA=100MOVAL,ALFA;AL←100ALFA=ALFA+2;ALFA=102MOVAL,ALFA;AL←102(2)等号伪指令格式:符号名=表达式功能:将表达式的值赋给符号名等号伪指令可以在程序中不同的地方多次使用以重新为符号名赋值。常用伪指令[例5-11]1.符号定义伪指令(赋值语句)[例5-13]BARYLABELWORD;定义BARY为字类型┆ADDAX,BARY;字加法ABCFLABELFAR;ABCF为FAR类型标号(3)定义符号名和伪指令格式:符号名LABEL类型功能:定义一个标号或变量,并指定其类型。常用伪指令5.2.21.符号定义伪指令(赋值语句)[例5-13](3)定义符号名和伪指令常用伪指令5.2.21数据定义伪指令2.

格式:[变量名]DB表达式;定义字节[变量名]DW表达式;定义字[变量名]DD表达式;定义双字[变量名]DQ表达式;定义8个字节[变量名]DT表达式;定义10个字节常用伪指令5.2.2数据定义伪指令2.格式:常用伪指令5.2.2

表达式是赋给变量的初始值,可以有一个,也可以有多个,常见的有以下几种:这实际上是为数据分配存储单元,并把变量名作为该存储单元的名称。(1)数值表达式常用伪指令5.2.2数据定义伪指令2.

DW伪指令可以为两个字符组成的字符串分配一个字单元。(2)ASCII字符串可以用DB伪指令为ASCII字符串中的每一个字符分配一个字单元。(3)?表达式这是为数据项分配存储单元的一种方法,只是存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。(4)重复定义子句DUP利用重复定义子句DUP可以为若干个重复数据分配存储单元。表达式是赋给变量的初始值,可以有一个,也可以有多个,常段定义伪指令

●段定义伪指令用于将源程序划分成若干段,这些逻辑段按用途可分为代码段(用于存放程序)、数据段(用于存放数据)、堆栈段(用于堆栈操作)和附加段(附加的数据段)。●需要说明的是,并不是所有的程序都必须包含这四个逻辑段,有时只需要一个段或两个段。●功能:把模块划分为若干个逻辑段。每个SEGMENT/ENDS可定义一个逻辑段。3.

格式:段名SEGMENT[定位类型][组合类型][′类别名′]┆段名ENDS常用伪指令5.2.2段定义伪指令●段定义伪指令用于将源程序划分成若干段,这些逻段寄存器说明伪指令4.格式:ASSUME段寄存器:段名[,段寄存器:段名…]功能:向汇编程序指示当前各段所用的段寄存器,设定段寄存器与段的对应关系。常用伪指令5.2.2过程定义伪指令●过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成的。5.格式:过程名PROC[NEAR/FAR]┇}过程体RET过程名ENDP功能:完成过程定义,在过程体中实现过程的操作功能

段寄存器说明伪指令4.格式:ASSUME段寄存器:模块定义及通信伪指令●汇编语言可以把程序划分成许多模块,并对每个模块独立地进行汇编和调试。(1)模块开始伪指令6.格式:NAME模块名功能:指明程序模块的开始,并指出模块名。常用伪指令5.2.2(2)模块结束伪指令(源程序结束伪指令)格式:END启动标号或过程名功能:END表示一个模块的结束。通知汇编程序源程序到此结束,并给出执行程序的入口位置。模块定义及通信伪指令●汇编语言可以把程序划分成许多模块,并对(3)定义公共符号名伪指令格式:PUBLIC符号名[,┅]符号名可以是变量、符号常量、标号或过程名。功能:由PUBLIC定义的符号名,可以被其他模块引用,即由其定义的符号名是公共符号名,可以被外部模块引用。

常用伪指令5.2.2模块定义及通信伪指令6.定义外部符号名伪指令(4)格式:EXTRN符号名:类型[,┅]符号名在其他模块中已由PUBLIC所定义。类型指的是符号名的类型,符号名的类型应与原模块中定义的类型一致。它们可以是:●内存变量型:BYTE、WORD、DWORD●过程型:NEAR、FAR●数值型:ABS功能:定义本模块中将要引用的外部模块中的符号名,它们应在各自的模块中已用PUBLIC伪指令进行了定义。(3)定义公共符号名伪指令格式:PUBLIC符号名[,列表伪指令(1)格式控制伪指令●格式控制伪指令用于对源程序排版、加标题和子标题。

7.常用伪指令5.2.2(2)列表控制伪指令格式:.LIST.XLIST%OUT功能:.LIST用于打开列表文件的输出。.XLIST用于关闭列表文件的输出。%OUT可在汇编时显示接在其后的信息,以便了解汇编的过程。

列表伪指令(1)格式控制伪指令●格式控制伪指令用于对源程8.记录伪指令(1)记录定义【例5-23】表示一个学生情况的记录,设年龄占5位,性别占1位(1:男,0:女),身体状况占2位(00:健康,01:良好,10:一般,11:差),可定义为:

STDRCRECORDYER:5,SEX:1=0,STT:2①记录名、字段名必须存在,不可使用默认值。②各字段总和不能超过16位。③表达式的初值应取正整数。注意格式:记录名RECORD字段名:宽度[=表达式][,┅]功能:用于定义一个记录。指明记录中字段的位长度及初值,并用记录名表示已定义的记录。

常用伪指令5.2.28.记录伪指令(1)记录定义【例5-23】表示一个学(2)记录存储单元分配及赋值【例5-24】TANRECORDX:6,Y:4,Z:6APTAN<5,10,,>BPTAN<12,20>●字段值表中缺省项的默认值为0。注意●此例在存储器中分配两个记录,每个记录为两个字节。格式:记录变量名记录名<字段值表>功能:将字段值表中的各字段值赋给记录的各字段。常用伪指令5.2.28.记录伪指令(2)记录存储单元分配及赋值【例5-24】●字段值表中缺记录操作符1)取字段宽度操作符【例5-25】MOVAL,WIDTHYER;AL←5MOVBH,WIDTHSEX;BH←1MOVAH,WIDTHSTDRC;AH←8(3)格式:WIDTH记录名或记录字段名功能:用于返回该记录或记录字段的宽度(二进制位数)。常用伪指令5.2.28.记录伪指令记录操作符1)取字段宽度操作符【例5-25】(3)格式2)取字段位置操作符【例5-26】

MOVBL,MASKYER;BL←11111000MOVAH,MASKSEX;AH←00000100格式:MASK字段名功能:返回一个8位或16位的二进制数。该字段所在的位为1,其他位为0,以确定该字段在记录中所在的字段的位置。常用伪指令5.2.2记录操作符(3)8.记录伪指令2)取字段位置操作符【例5-26】格式:MASK结构伪指令●结构伪指令是把多个数据定义语句组成一个结构,而把每一个数据定义语句称为一个结构字段,内存变量名称为字段名。(1)结构定义伪指令【例5-27】ABCSTRUCADB?BDBABC12′CDW120ABCENDS9.格式:结构名STRUC[字段名]〈数据定义语句〉┇结构名ENDS

功能:定义一个结构。它含有由数据定义语句所确定的数据结构,并引用结构名来代表这种结构。

常用伪指令5.2.2结构伪指令●结构伪指令是把多个数据定义语句组成一个结构,而把条件汇编伪指令●条件汇编的主要作用是根据条件有选择地对程序汇编。10.一般格式:IF××〈表达式〉┇}程序段1[ELSE]┇}程序段2

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

●为了简化汇编语言源程序,可以把一些频繁出现的程序段定义为“宏指令”1.宏定义及其调用5.3宏定义的一般格式为:宏指令名MACRO[形参,形参,┅]┇宏体

ENDM宏指令●为了简化汇编语言源程序,可以把一些频繁出现的程序段2.带参数的宏【例5-35】SHIFTMACROXMOVCL,XSALAL,CLENDM●X是一个形式参数,这里代表移位次数。在调用时,可把实际要求的移位次数作为实际参数代入,如SHIFT4,就可用实在参数4代替在宏定义体中出现的形式参数X,从而实现移位4次。若再引用一个形式参数:SHIFTMACROX,YMOVCL,XSALY,CLENDM●用形式参数Y来代替需要移位的寄存器,只要在调用时,把要移位的寄存器作为实际参数代入,就可以对任一个寄存器实现指定的左移操作。宏指令5.32.带参数的宏【例5-35】SHIFTMACRO3.主要的宏操作伪指令(1)宏定义伪指令(2)取消宏指令名伪指令(3)重复伪指令格式:宏指令名MACRO[形参,形参,┅]┇宏体ENDM格式:REPT(表达式)┇宏体ENDM功能:重复执行若干次宏体所包含的语句。其中执行的次数由表达式的值决定。格式:PURGE宏指令名[,┅]功能:用于注销若干宏定义。宏指令5.33.主要的宏操作伪指令(1)宏定义伪指令(2)取消宏指令5.4.1汇编语言源程序的结构DATA SEGMENT ┇ DATAENDS STACKSEGMENTPARASTACK‘STACK’ ┇ STACKENDS CODESEGMENT

ASSUMECS:CODE, SS:STACK,DS: DATA,ES:DATASTART:MOV AX,DATA MOV DS,AX

MOVES,AX MOV AX,STACK MOV SS,AX ┇ MOV AH,4CH INT 21HPRA PROC NEAR ┇PRA ENDP┇CODEENDS END START汇编语言程序的结构汇编语言源程序的结构DATA SEGME汇编语言和DOS操作系统之间的接口5.4.2正常返回DOS的方法如下: CODESEGMENT ┇ STARTPROCFAR PUSHDS ;保护PSP段地址 MOV AX,0 ;保护偏移0地址 PUSHAX ┇ RET STARTENDP CODEENDS ENDSTART还有一种非标准返回DOS的方法,即在CODEENDS之前插入:

MOVAH,4CH INT21H汇编语言和DOS操作系统之间的接口5.4.2正常返回DOS的DOS系统功能调用5.5●INT21H中断本身包含很多子程序,每个子程序对应一个功能,其编号从0~62H。调用它们时采用统一的格式如下:①传送入口参数到指定寄存器中;②功能号送入AH寄存器;③INT21H。●

MSDOS中常用的软中断有8条,系统规定它们的中断类型码为20H~27H,它们各自的功能及入口/出口参数见表4-3。DOS系统功能调用5.5●INT21H中断本身包含很多子程1.键盘输入单字符——1号系统功能调用使用格式如下:

MOV AH,1 INT 21HDOS系统功能调用5.52.无回显键盘输入单字符——8号系统功能调用

使用格式如下:

MOVAH,8INT21H3.无回显直接控制台输入单字符——7号系统功能调用

使用格式如下:

MOVAH,7INT21H4.键盘输入字符串——0AH号系统功能调用┇

BUF DB 20 ;定义缓冲区长度 DB ? ;由系统填写实际键入字符数 DB 20DUP(?) ;用于存放键入的字符,最多可键入19 ;个字符,最后一个必须是回车符0DH ┇ MOV DX,OFFSETBUF MOV AH,0AH

INT 21H ;0AH号系统功能调用

1.键盘输入单字符——1号系统功能调用使用格式如下:4.键盘输入字符串——0AH号系统功能调用┇BUF DB 20 ;定义缓冲区长度 DB ? ;由系统填写实际键入字符数 DB 20DUP(?) ;用于存放键入的字符,最多可键入19 ;个字符,最后一个必须是回车符0DH ┇ MOV DX,OFFSETBUF MOV AH,0AH

INT 21H ;0AH号系统功能调用

DOS系统功能调用5.54.键盘输入字符串——0AH号系统功能调用使用格式如下:

MOV DL,′A′ MOV AH,2 INT 21H5.输出单字符——2号系统功能调用DOS系统功能调用5.56.输出字符串——9号系统功能调用BUFDB′GOODBYE$′┇MOVDX,OFFSETBUFMOVAH,9INT21H;在显示器屏幕上显示GOOD;BYE

使用格式如下:5.输出单字符——2号系统功能调用D如果DL=0FFH,则表示是从键盘输入单字符送AL寄存器;如果DL≠0FFH,则表示是将DL寄存器中的内容送屏幕显示输出。它们的使用格式如下:MOVDL,0FFHMOVAH,6INT21H;键盘输入单字符送ALMOVDL,′A′MOVAH,6INT21H;将DL中的字符A送屏幕显示

7.直接控制台输入/输出单字符——6号系统功能调用DOS系统功能调用5.5如果DL=0FFH,则表示是从键盘输入单字符送AL寄存器;使用格式如下:

MOVAH,4CHINT21H●它没有入口参数,执行结果是结束当前正在执行的程序,并返回DOS操作系统。8.返回操作系统——4CH号系统功能调用DOS系统功能调用5.5使用格式如下:8.返回操作系统——4CH号系统功能调9.从串口输入单字符——3号系统功能调用10.向串口输出单字符——4号系统功能调用使用格式如下:MOVAH,3INT21H●它没有入口参数,系统将从异步通信口串行输入的字符置入AL寄存器中。使用格式如下:MOVDL,′$′MOVAH,4INT21H●执行时将DL寄存器中的字符通过异步通信口串行输出。为节省篇幅,不再赘述其他的系统功能调用,需要时请参阅附录B。

DOS系统功能调用5.59.从串口输入单字符——3号系统功能调用10.向串口输出单汇编语言程序设计5.6.1程序设计步骤●程序是计算机命令的有序集合,用计算机求解某些问题时往往需要编制程序,其设计步骤归纳如下:5.6(1)分析问题(2)建立数学模型(3)确定算法(4)绘制程序流程图(5)内存空间分配(6)编制程序与静态检查(7)程序调试汇编语言程序设计5.6.1程序设计步骤●程序是计算机命令汇编语言程序设计方法1.简单程序设计●简单程序,又称为顺序程序。这种程序的形式最简单,计算机执行程序的方式是“从头到尾”,逐条执行指令语句,直到程序结束,这是最基本的形式,任何程序都离不开这种形式。●在汇编语言程序中简单程序主要由数据传送指令、算术运算指令和逻辑运算指令组合而成。5.6.2

DATASEGMENTXDW5RESULTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,5 MULX

ADDAX,4 MULX SUBAX,3 MULX ADDAX,2 MOVRESULT,AX MOVAH,4CH INT21H CODEENDSENDSTART汇编语言程序设计方法1.简单程序设计●简单程序,又称为顺序汇编语言程序设计方法5.6.22.分支程序设计●分支程序可以有两种形式:简单分支结构和多分支结构。其中简单分支结构有两种,相当于高级语言中的IFTHEN和IFTHENELSE结构;多分支结构则相当于高级语言中的DO-CASE结构。它们的流程图如图4-3所示。【例5-37】

比较两个无符号数的大小。在A和B单元各有一个8位无符号数,要求比较这两个无符号数,并根据比较结果在屏幕上显示A>B或B>A(假设这两个数不相等)。(1)简单分支程序设计分析:首先使用比较指令比较两个无符号数的大小,然后根据标志位,使用无符号数转移指令实现转移。其程序流程图如图5-4所示。

汇编语言程序设计方法5.6.22.分支程序设计●分支程序可汇编语言程序设计方法5.6.22.分支程序设计【例5-37】

比较两个无符号数的大小。DATASEGMENTADB20HB DB92HDATAENDS CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAL,ACMPB,AL JABGA MOVDL,‘A’ MOVBL,‘B’ JMPDISPBGA:MOVDL,‘B’MOVBL,‘A’ DISP:MOVAH,2 INT21H MOVDL,‘>’ INT21HMOVDL,BLINT21H MOVAH,4CH INT21H CODEENDS

ENDSTART简单分支程序设计汇编语言程序设计方法5.6.22.分支程序设计【例5-37汇编语言程序设计方法5.6.22.分支程序设计【例5-38】某应用程序主菜单有8个可选项,其入口地址分别记为R0、R1…R7。要求编制程序根据变量N的值转向相应的处理程序(N为入口编号)。

DATASEGMENTBASEDWR0,R1,R2,R3 DWR4,R5,R6,R7N DB5DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXMOVAL,NADDAL,AL

MOVAH,0MOVBX,OFFSETBASE ADDBX,AXMOVAX,[BX]JMP AX R0: ┇ JMPOKR1: ┇ JMPOK ┇R7: ┇ OK: MOVAH,4CH INT21H CODEENDS ENDSTART多分支程序设计汇编语言程序设计方法5.6.22.分支程序设计【例5-383.(1)循环程序的结构与组成循环程序设计2)循环工作部分又称为循环体,是循环结构的基本部分,完成实际的处理操作。

3)循环控制部分循环控制部分用于控制重复执行的次数。包括修改变量、修改指针,为下一次循环做准备,以及修改循环计数器,判断循环结束条件是否满足,若条件满足则退出循环,否则继续循环。

4)循环结束部分

主要用来分析和存放程序的结果。

循环的初始化部分建立循环初始值,如初始化地址指针、计数器以及其他循环参数的起始值等。汇编语言程序设计方法5.6.23.(1)循环程序的结构与组成循环程序设计2)循环工作3.循环程序设计(2)循环控制方法汇编语言程序设计方法5.6.2计数法【例5-39】统计负数个数并显示。

DATASEGMENTBUF DB 2,-1,56……COUNTEQU20NEGADB?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEA

SI,OFFSETMOVDL,0 MOVCX,COUNTLP: MOVAL,[SI]

ANDAL,AL

JNS NEXT INC DL NEXT:INC SI LOOPLPMOVNEGA,DL OR DL,30H MOVAH,2 INT 21H MOVAH,4CH INT 21H CODEENDS

ENDSTART3.循环程序设计(2)循环控制方法汇编语言程序设计方法53.循环程序设计(3)多重循环●设计多重循环程序时,可以从外层循环到内层循环一层一层的进行。通常在设计外层循环时,仅把内层循环看成一个处理粗框,然后再将粗框细化,分成初始化、工作、控制、结束四个组成部分。当内层循环设计完毕以后,用其替换外层循环体中被视为处理粗框的对应部分,就构成了一个多重循环程序。汇编语言程序设计方法5.6.2●虽然多重循环程序可以嵌套,但不能交叉。此外,转移指令可以从循环结构内转出,但一般不要从外循环直接跳进内循环。特别要注意的是,不要使循环回到初始化部分,这样可能会出现死循环。注意3.循环程序设计(3)多重循环●设计多重循环程序时,可以子程序设计●子程序相对主程序而言,是一个子的程序段,确切地说,它是被主程序调用的程序。子程序调用示意图如图5-8所示。图5-8子程序调用示意图子主b子主a子1子2主c子1子2主d4.汇编语言程序设计方法5.6.2子程序设计●子程序相对主程序而言,是一个子的程序段,确切地说●一般来说有公用性、重复性或有相对独立性的程序段应设计成子程序。这种结构给程序设计带来了许多方便。(2)子程序设计应注意的问题·子程序名·功能、技术指标(如执行时间等)·入口参数、出口参数·嵌套哪些子程序

1)现场保护和恢复。2)参数传递。3)子程序说明。(1)子程序调用和返回汇编语言程序设计方法5.6.2用CALL和RET指令来实现子程序的调用和返回,CALL指令在主程序中,RET指令通常在子程序末尾。●一般来说有公用性、重复性或有相对独立性的程序段应设计成子程(3)子程序调用技巧1)子程序嵌套●子程序调用子程序的过程称为子程序嵌套,如图5-8d所示。2)子程序递归●子程序调用自身的过程称为递归,如图5-9a所示。3)可重入子程序●子程序被调用后没有执行完又被另一程序重复调用称为可重入子程序。一般用于多用户系统如图4-9b所示。4)协同子程序●两个以上子程序协同完成同一任务,且相互调用,直到任务结束。汇编语言程序设计方法5.6.2(3)子程序调用技巧1)子程序嵌套●子程序调用子程序的过程图4-9子程序递归和重入示意图主子a子程序主程序1主程序2b汇编语言程序设计方法5.6.2(3)子程序调用技巧图4-9子程序递归和重入示意图主子a子程序主程序1主程序程序设计举例●前面已经介绍了程序设计的基本方法。本节将给出一些程序设计的例子,这些例子涉及一些常用程序,通过这些例子可以掌握一些程序设计的技巧和方法。1.算术运算程序【例5-44】多字节压缩型十进制数加法。5.6.3分析:压缩型十进制数即用压缩型BCD码表示的十进制数。因为是多字节数,所以可以用循环程序来完成加法运算。每次循环完成一个字节的加法。需要注意的是,相加之后必须使用压缩BCD码加法调整指令DAA进行十进制调整。程序设计举例●前面已经介绍了程序设计的基本方法。本节将给出一非数值处理程序●非数值处理即处理数值以外的数据,如字符、字符串、代码、记录和表格等。非数值处理程序有很多,主要有:代码转换、字符处理、表处理等。(1)代码转换1)BCD码与ASCII码间的相互转换。2.程序设计举例5.6.3【例5-45】已知从A单元开始存有10个字节的压缩BCD码,要求编程将其转换为ASCII码并显示在CRT上。

分析:压缩型BCD码要转换为ASCII码应该首先利用SHR指令将高4位移至低4位的位置上,然后转换为ASCII码送入DL,用2号调用显示;其次利用AND指令将原数的高4位清零,然后也转换为ASCII码送入DL,用2号调用显示。非数值处理程序●非数值处理即处理数值以外的数据,如字符、字符非数值处理程序2.程序设计举例5.6.3【例5-45】压缩BCD码转换为ASCII码。DATASEGMENTA DB 34H,68H,…N EQU$-ADATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,STACK MOVSS,AX LEABX,A MOVCX,NLP: MOVAL,[BX] MOVDH,AL PUSHCX MOVCL,4SHRAL,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 LOOPLP MOV AH,4CH INT 21HCODEENDS END START非数值处理程序2.程序设计举例5.6.3【例5-45】压缩B非数值处理程序●非数值处理即处理数值以外的数据,如字符、字符串、代码、记录和表格等。非数值处理程序有很多,主要有:代码转换、字符处理、表处理等。(1)代码转换2)二进制数到七段显示码的转换。2.程序设计举例5.6.3非数值处理程序●非数值处理即处理数值以外的数据,如字符、字符图5-11七段显示器及其显示码表18H00H78H02H12H19H30H24H79H40H码9876543210数D0D1D2D3D4D5D60gaabef不用gdccbdefa)外形图b)各段与字节各位的对应关系c)十进制数于七段显示码的关系表程序设计举例5.6.3非数值处理程序2.(1)代码转换图5-11七段显示器及其显示码表18H00H78H02H非数值处理程序【例5-46】二进制数到七段显示码的转换。2.程序设计举例5.6.3DATASEGMENTA DB 34H,68H,…N EQU$-ADATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,STACK MOVSS,AX LEABX,A MOVCX,NLP: MOVAL,[BX] MOVDH,AL PUSHCX MOVCL,4SHRAL,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 LOOPLP MOV AH,4CH INT 21HCODEENDS END START非数值处理程序【例5-46】二进制数到七段显示码的转换。2.(2)字符数据处理

(3)表处理●字符和字符串的处理是计算机应用的一个重要方面。字符数据处理一般包括统计、比较、删除、插入等。●表格是软件最基本的数据结构。表格中可以存放一系列相关联的数据及执行结果,可供运算和查询。程序设计举例5.6.3【例5-48】数据或程序的加密。从键盘上输入一个0~9之间的数字,将其加密后存入MIMA单元。

分析:为了使数据能够保密,可以建立一个密码表,利用换码指令将数据加密。比如,可以选择密码为: 原数字:0,1,2,3,4,5,6,7,8,9 密码字:2,9,4,6,3,0,7,8,5,1(2)字符数据处理(3)表处理●字符和字符串的处理是计(3)表处理程序设计举例5.6.3【例5-48】数据或程序的加密。

DATASEGMENTMITABDB‘2946307851’JMITABDB‘5904283671’MIMADB ?DATAENDSSTACKSEGMENTPARA STACK‘STACK’STT DB 100 DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA MOVDS,AX MOV AX,STACK MOV SS,AX MOVAH,1 INT 21H AND AL,0FH LEA BX,MITAB XLAT MOVMIMA,ALDONE:MOVAH,4CH INT 21HCODEENDS ENDSTART(3)表处理程序设计举例5.6.3【例5-48】数据或软件调试技术5.7.1调试软件DEBUG简介●DEBUG调试软件是专为汇编语言设计的一种调试工具,具有跟踪程序执行、观察运行中间结果、显示和修改寄存器或存储单元内容等多项功能,是开发汇编语言程序所必须掌握的调试手段。

5.7●在操作系统环境下,启动DEBUG后将进入DEBUG的命令状态,在此状态下,可以使用DEBUG的任何命令,每个命令均以回车结尾。

●在DEBUG状态下,所有地址、数据均以无后缀的16进制表示,如:123F、F0AA等。注意软件调试技术5.7.1调试软件DEBUG简介●DEBUG调DEBUG命令中的“地址”和“地址范围”:5.7.1调试软件DEBUG简介●地址表示形式段寄存器名:相对地址例:DS:100或段地址:相对地址例:24AB:1000或相对地址例:1000●地址范围表示:起始地址结束地址或起始地址L(表示字节数)

DEBUG命令中的“地址”和“地址范围”:5.7.1调试常用DEBUG命令

1.显示存储单元内容

5.7.1调试软件DEBUG简介●格式1:D[起始地址]格式2:D[地址范围]

2.修改存储单元内容

●格式1:E起始地址[列表]格式2:E地址

3.显示、修改寄存器内容●格式:R[寄存器名]4.运行命令

●格式:G[=起始地址][第一断点地址][第二断点地址……]5.跟踪命令

●格式:T[=起始地址][正整数]

常用DEBUG命令

1.显示存储单元内容5.7.1调试6.汇编命令

5.7.1调试软件DEBUG简介●格式:A[起始地址]

7.反汇编命令

●格式1:U[起始地址]格式2:U地址范围8.指定文件名命令

●格式:N文件名及扩展名9.装入命令

●格式1:L起始地址驱动器号起始扇区扇区数格式2:L[起始地址]10.写磁盘命令

●格式1:W起始地址驱动器号起始扇区扇区数格式2:W[起始地址]11.退出命令

●格式:Q

6.汇编命令5.7.1调试软件DEBUG简介●格式5.7.2软件调试的基本方法利用调试软件DEBUG装入二进制执行程序,通过连续运行、分段运行、单步运行,可以实现软件剖析、查错或修改。将.COM文件装入后,指令指针IP置成100H,即程序入口的相对地址。首先从此处开始连续运行,考察程序的功能是否达到。如果出错,则可用分段运行方式,缩小错误所在程序段的范围,然后,再用单步方式找出错误确切所在处。对.EXE类型文件的调试与上相似,但不能直接用DEBUG存盘命令存盘。用DEBUG调试程序需要注意以下几点:5.7.2软件调试的基本方法利用调试软件DEBUG装入二5.7.2软件调试的基本方法●设有程序EXAMP.COM,调试方法如下:

在此期间如果出现问题,就说明这些指令中有错误,这时,可用单步逐条执行,如:-T=100执行这一条指令后,会显示通用寄存器、段寄存器、标志寄存器的内容。由此可分析出本条指令的执行结果是否正确。若正确,则执行下一条指令;否则进行必要的修改。●C>DEBUGEXAMP.COM↙-G可以先用上述命令连续执行程序,如果结果不正确或死机,应该使用分段方式运行,查看问题出现在哪里,此时可用到T命令或G命令。

-T=100,5或–G断点前者从相对地址为100H开始执行EXAMP.COM,连续执行5条指令;后者从当前地址开始连续执行到断点。可以恰当地选择执行的指令条数或断点,确定分段大小(一般应是完成相对完整的子功能的一段程序)。5.7.2软件调试的基本方法●设有程序EXAMP.COM5.7.2软件调试的基本方法●软件调试举例下面是TEST.EXE文件的调试过程:

C:>DEBUGTEST.EXEDEBUG程序以“-”做提示符等待键入命令。要查看程序运行的情况,就必须首先用反汇编指令U来列出程序清单。-U其中最左边给出了指令所在的段地址:偏移地址,然后是机器语言指令,右边是汇编语言指令,指令中所有的符号都被具体的数据代替。从列出的程序清单可以看出从13CAH:002CH开始存放的是返回DOS操作系统的指令,所以程序执行时执行到002CH就可以在存储单元中看到排序后的结果了。不过在看结果之前可以先查看一下排序前的数据,这样就可以先将断点设在装填数据段之后,即0005H处。5.7.2软件调试的基本方法●软件调试举例下面是TEST5.7.2软件调试的基本方法●软件调试举例反汇编后的程序:

13CA:0000B8CA13MOVAX,132913CA:00038ED8MOVDS,AX13CA:0005B506MOVCH,0613CA:0007FECDDECCH13CA:0009BE0000MOVSI,000013CA:000C8ACDMOVCL,CH13CA:000E32DBXORBL,BL13CA:00108A04MOVAL,[SI]13CA:00123A4401CMPAL,[SI+01]13CA:00157E08JLE001F13CA:0017864401XCHGAL,[SI+01]13CA:001A8804MOV[SI],AL13CA:001C80CB01ORBL,0113CA:001F46 INC SI

13CA:0020FEC9DECCL13CA:002275ECJNZ001013CA:002422DBANDBL,BL13CA:00267404JZ 002C13CA:0028FECDDECCH13CA:002A75DDJNZ000913CA:002CB44CMOVAH,4C13CA:002ECD21INT215.7.2软件调试的基本方法●软件调试举例反汇编后的程序5.7.2软件调试的基本方法●软件调试举例下面用G命令将程序执行到0005H,命令和屏幕显示如下:

-G0005AX=1379BX=0000CX=0080DX=0000SP=0000BP=0000SI=0000DI=0000DS=13C9ES=13B9SS=13C9CS=13CAIP=0005NVUPEIPLNZNAPONC13CA:0005B506 MOV CH,065.7.2软件调试的基本方法●软件调试举例下面用G命令将5.7.2软件调试的基本方法●软件调试举例下面用D命令来察看一下未排序之前这些存储单元的内容。

-D13C9:0000000513C9:00000C4EFE004B0F.N..K.其中第2行显示的就是从TABLE开始的6个字节的内容,刚好对应程序中的十进制数12、78、-2、0、75和15,最右边给出的是这些数据对应的ASCII字符。

5.7.2软件调试的基本方法●软件调试举例下面用D命令来5.7.2软件调试的基本方法●软件调试举例下面要做的就是将程序执行到002CH(即返回DOS之前),然后再用D命令查看上述单元。

-G002CAX=130CBX=0000CX=0300DX=0000SP=0000BP=0000SI=0003D

温馨提示

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

评论

0/150

提交评论