微型计算机原理与接口技术(4)_第1页
微型计算机原理与接口技术(4)_第2页
微型计算机原理与接口技术(4)_第3页
微型计算机原理与接口技术(4)_第4页
微型计算机原理与接口技术(4)_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章第四章 汇编语言程序设计汇编语言程序设计 汇编语言是利用指令的助记符、符号地址、标号来编写的语言,它是机器语汇编语言是利用指令的助记符、符号地址、标号来编写的语言,它是机器语言的符号表示,是较低级的语言。利用汇编语言编写的程序称为源程序,指令系统言的符号表示,是较低级的语言。利用汇编语言编写的程序称为源程序,指令系统中的每条指令都是构成源程序的基本语句。但机器不能识别源程序,要通过汇编程中的每条指令都是构成源程序的基本语句。但机器不能识别源程序,要通过汇编程序翻译成二进制代码的浮动目标程序,然后由连接程序将目标文件与库文件相连,序翻译成二进制代码的浮动目标程序,然后由连接程序将目标文件与

2、库文件相连,最后得到可执行的程序,才可在机器上直接运行。最后得到可执行的程序,才可在机器上直接运行。 一个完整的汇编程序编写格式要包括以下几部分:段定义、段分配、设置段一个完整的汇编程序编写格式要包括以下几部分:段定义、段分配、设置段地址、返回地址、返回DOSDOS语句及程序结束,需要时加上过程调用。语句及程序结束,需要时加上过程调用。 (1)(1)汇编语言编写的原程序是分段的,要定义代码段、数据段、堆栈段,每段汇编语言编写的原程序是分段的,要定义代码段、数据段、堆栈段,每段由段定义伪指令由段定义伪指令SEGMENTSEGMENT开始,开始,ENDSENDS结束,并赋予段名区分不同段。段定义的

3、基本结束,并赋予段名区分不同段。段定义的基本格式如下:格式如下: 段名段名 SEGMENTSEGMENT 段名段名 ENDSENDS 原程序中至少有一个代码段,此时数据可放在代码段中;堆栈段如果不定义,原程序中至少有一个代码段,此时数据可放在代码段中;堆栈段如果不定义,由计算机自动分配。段名可以自己定义,用字母和数字组成。计算机识别不同的段由计算机自动分配。段名可以自己定义,用字母和数字组成。计算机识别不同的段由段分配伪指令由段分配伪指令ASSUMEASSUME来完成。段分配的格式为:来完成。段分配的格式为: ASSUME CS ASSUME CS:段名,:段名,DSDS:段名,:段名,SSS

4、S:段名,:段名,ESES:段名:段名 (2)(2)过程调用由伪指令过程调用由伪指令PROCENDPPROCENDP实现,过程的调用格式如下实现,过程的调用格式如下( (也可省略也可省略) ): 过程名过程名 PROC FAR(NEAR)PROC FAR(NEAR);FARFAR表示远调用,表示远调用,NEARNEAR表示近调用可缺省表示近调用可缺省 过程名过程名 ENDPENDP (3) (3)若程序已经分别定义了数据段、堆栈段和附加段,主程序的开始要设若程序已经分别定义了数据段、堆栈段和附加段,主程序的开始要设置这些段的地址。代码段的地址不能人为设置,由计算机分配。堆栈段和数据置这些段的地

5、址。代码段的地址不能人为设置,由计算机分配。堆栈段和数据段设置的具体语句为;段设置的具体语句为; MOV AXMOV AX,STACK STACK ;送堆栈段地址;送堆栈段地址 MOV SSMOV SS,AXAX MOV AX, DATA MOV AX, DATA ;送数据段地址;送数据段地址 MOV DSMOV DS,AXAX (4) (4)程序执行完毕要返回程序执行完毕要返回DOSDOS操作系统,有两种方式实现。一种是在程序的操作系统,有两种方式实现。一种是在程序的开始部分编写如下语句:开始部分编写如下语句: PUSH DSPUSH DS MOV AX,0 MOV AX,0 PUSH AX

6、 PUSH AX 将将DSDS的内容及的内容及0 0作为段地址和偏移地址入栈,在程序结束时返回作为段地址和偏移地址入栈,在程序结束时返回DOSDOS。以上。以上三句语句必须写在堆栈段设置后面,否则堆栈段的设置使一些指令不起作用了。三句语句必须写在堆栈段设置后面,否则堆栈段的设置使一些指令不起作用了。第二种方法是在程序结束前使用第二种方法是在程序结束前使用DOSDOS功能调用指令,如下所示:功能调用指令,如下所示: MOV AXMOV AX,4C00H 4C00H INT 21H INT 21H (5) (5)全部源程序用全部源程序用ENDEND语句结尾,语句结尾,ENDEND后面可以加上程序执

7、行起始的名称后面可以加上程序执行起始的名称STARTSTART,汇编程序遇见,汇编程序遇见ENDEND语句就结束。语句就结束。4.1 4.1 汇编语言程序格式汇编语言程序格式 80868086系统中常用的汇编程序是系统中常用的汇编程序是MASM6.XMASM6.X版本,版本,MASMMASM中可使用的语句分成两类:中可使用的语句分成两类:指令性语句和伪指令语句。指令性语句和伪指令语句。一、指令性语句一、指令性语句 指令性语句与机器指令相对应,汇编程序可将它翻译成目标代码指令性语句与机器指令相对应,汇编程序可将它翻译成目标代码( (机器指令机器指令代码代码) )。语句格式为:。语句格式为:标号:

8、指令助记符标号:指令助记符 操作数,操作数操作数,操作数 ;注释;注释 标号表示本指令语句的符号地址,标号后面必须紧跟冒号标号表示本指令语句的符号地址,标号后面必须紧跟冒号“:”。 指令助记符是该语句的指令名称的代表符号,它指出指令的操作类型,汇编指令助记符是该语句的指令名称的代表符号,它指出指令的操作类型,汇编程序将其翻译成机器指令。它是语句中的关键字,因此不可省略。程序将其翻译成机器指令。它是语句中的关键字,因此不可省略。 操作数表示参加本指令运算的数据,根据指令要求可以有一个或多个操作数,操作数表示参加本指令运算的数据,根据指令要求可以有一个或多个操作数,有的指令不需要操作数,多个操作数

9、之间用逗号有的指令不需要操作数,多个操作数之间用逗号“,”隔开,操作数与指令助记隔开,操作数与指令助记符之间用空格隔开。操作数可以是常数、变量、标号、寄存器名或表达式。符之间用空格隔开。操作数可以是常数、变量、标号、寄存器名或表达式。二、伪指令语句二、伪指令语句 伪指令语句没有对应的机器指令,汇编程序汇编源程序时对伪指令进行处理,伪指令语句没有对应的机器指令,汇编程序汇编源程序时对伪指令进行处理,它可完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。伪指它可完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。伪指令语句的格式为:令语句的格式为: 名字名字 伪指令指示符伪指

10、令指示符 操作数,操作数操作数,操作数 ;注释;注释 名字是给伪指令取的名称,它用符号地址表示,名字后不允许带冒号名字是给伪指令取的名称,它用符号地址表示,名字后不允许带冒号“:”,名字可以省略。伪指令中的名字通常是变量名、段名、过程名、符号名等。名字可以省略。伪指令中的名字通常是变量名、段名、过程名、符号名等。 伪指令指示符是汇编程序伪指令指示符是汇编程序MASMMASM规定的符号,常用的有变量定义语句规定的符号,常用的有变量定义语句(DB(DB、DW)DW),符号定义语句符号定义语句(EQU(EQU、) ),段定义语句,段定义语句(SEGMENT.ENDS)(SEGMENT.ENDS),段

11、分配语句,段分配语句(ASSUME)(ASSUME),结构定义语句结构定义语句(STURC.ENDS)(STURC.ENDS),过程定义语句,过程定义语句(PROR.ENDP)(PROR.ENDP)等类型,后面将详等类型,后面将详细说明。细说明。 操作数是由伪指令具体要求的,有的伪指令不允许带操作数,有的伪指令要操作数是由伪指令具体要求的,有的伪指令不允许带操作数,有的伪指令要求带多个操作数,多个操作数之间必须用逗号分开。操作数可以是常数、变量、求带多个操作数,多个操作数之间必须用逗号分开。操作数可以是常数、变量、字符串、表达式等。字符串、表达式等。三、数据项三、数据项 汇编语言中使用的操作数

12、,可以是常数,寄存器、存储器、变量、标号或汇编语言中使用的操作数,可以是常数,寄存器、存储器、变量、标号或表达式,其中常数、变量和标号是三种基本数据项。表达式,其中常数、变量和标号是三种基本数据项。1 1常数常数 常数必须是固定值,没有属性,是确定的数据。常数必须是固定值,没有属性,是确定的数据。2 2变量变量 变量通常指存放在存储单元中的值,在程序运行中是可以修改的。所有的变量通常指存放在存储单元中的值,在程序运行中是可以修改的。所有的变量都具有三个属性。变量都具有三个属性。 (1)(1)段值段值(SEGMENT)(SEGMENT)指变量所在段的段基址。指变量所在段的段基址。 (2)(2)段

13、内偏移地址段内偏移地址(OFFSET)(OFFSET):指变量地址与所在段首地址之间的地址偏移字:指变量地址与所在段首地址之间的地址偏移字节数。节数。 (3)(3)类型类型(TYPE)(TYPE):变量的类型属性指变量中每个元素所包含的字节数,类型有:变量的类型属性指变量中每个元素所包含的字节数,类型有:字节变量字节变量(BYTE)(BYTE)、宇变量、宇变量(WORD)(WORD)及双字变量及双字变量(DWORD)(DWORD)等。等。3 3标号标号 标号是可执行指令语句的地址的符号表示,它可作为转移指令的目标操作标号是可执行指令语句的地址的符号表示,它可作为转移指令的目标操作数,以确定程序

14、转向的目标地址,它具有三个属性。数,以确定程序转向的目标地址,它具有三个属性。 (1)(1)段值段值(SEGMENT)(SEGMENT):标号所在段的段基址。:标号所在段的段基址。 (2) (2)段内偏移地址段内偏移地址(OFFSET)(OFFSET):标号地址与所在段的段首址之间的偏移地址字:标号地址与所在段的段首址之间的偏移地址字节数。节数。 (3)(3)类型类型(TYPE)(TYPE):标号的类型属性指在转移指令中标号可转移的距离,也称:标号的类型属性指在转移指令中标号可转移的距离,也称距离属性。类型距离属性。类型NEARNEAR,表示此标号为近标号,只能实现本代码段内转移或调用,表示此

15、标号为近标号,只能实现本代码段内转移或调用,类型类型FARFAR,表示此标号为远标号,可以作为其它代码段中的目标地址,实现段间,表示此标号为远标号,可以作为其它代码段中的目标地址,实现段间转移或调用。若标号后面紧跟冒号,表示隐含此标号距离属性为转移或调用。若标号后面紧跟冒号,表示隐含此标号距离属性为NEARNEAR,也可用伪,也可用伪指令将此属性改为指令将此属性改为FARFAR。4.2 MASM4.2 MASM中的表达式中的表达式一、算术运算符一、算术运算符 加、减、乘、除、加、减、乘、除、MODMOD、SHLSHL、SHRSHR。运算对象与运算结果都是整数。运算对象与运算结果都是整数。二、逻

16、辑运算符二、逻辑运算符 逻辑运算符包括逻辑运算符包括AND(AND(与与) )、OR(OR(或或) )、NOT(NOT(非非) ),XOR(XOR(异或异或)4)4种,逻辑运算符是种,逻辑运算符是按位运算的,只能对常数进行运算,得到结果也是常数。按位运算的,只能对常数进行运算,得到结果也是常数。三、关系运算符三、关系运算符 关系运算符包括关系运算符包括EQ(EQ(相等相等) )、NE(NE(不等不等) )、LT(LT(小于小于) )、GT(GT(大于大于) )、LE(LE(小于或等小于或等于于) )、GE(GE(大于或等于大于或等于)6)6种。种。 关系运算符的两个操作数必须是数据,或是同一段

17、内的两个存储单元的地址。关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值,若结果为真,输出全是进行关系运算的比较操作后,结果是一个数值,若结果为真,输出全是l l,即,即0FFH0FFH或或0FFFFH0FFFFH。若结果为假,输出全是。若结果为假,输出全是0 0。关系运算符一般与逻辑运算符组合起来。关系运算符一般与逻辑运算符组合起来使用。使用。 四、数值返回运算符四、数值返回运算符1 1OFFSETOFFSET格式:格式:OFFSETOFFSET变量或标号变量或标号OFFSETOFFSET返回标号或变量的偏移地址值。返回标号或变量的

18、偏移地址值。 2 2SEGSEG格式:格式:SEGSEG变量或标号变量或标号SEGSEG用来取变量或标号的段基值。用来取变量或标号的段基值。 3 3TYPETYPE格式:格式:TYPE TYPE 变量或标号变量或标号TYPETYPE加在变量前,返回变量的类型属性,加在变量前,返回变量的类型属性,TYPETYPE加在标号前,返回标号的距离属性。加在标号前,返回标号的距离属性。4 4LENGTHLENGTH格式:格式:LENGTH LENGTH 变量变量当变量中使用当变量中使用DUPDUP时,时,LENGTHLENGTH返回此变量所包含的单元数,对其它变量则返回返回此变量所包含的单元数,对其它变量

19、则返回1 1。 5.SIZE5.SIZE格式格式:SIZE:SIZE变量变量SIZESIZE运算符加在变量前,返回该变量包含的总字节数。运算符加在变量前,返回该变量包含的总字节数。SIZESIZELENGTHLENGTHTYPETYPE 五、修改属性运算符五、修改属性运算符1.1.段操作符段操作符 格式:段前缀:变量或地址表达式格式:段前缀:变量或地址表达式 段前缀有段寄存器段前缀有段寄存器CSCS、DSDS、ESES、SSSS后跟冒号后跟冒号“:”,用来表示某个变量或,用来表示某个变量或地址被修改到哪个段寄存器提供的段基址中。地址被修改到哪个段寄存器提供的段基址中。2 2PTRPTR 格式:

20、类型格式:类型/ /距离距离 PTR PTR 变量或标号变量或标号 其功能是将其功能是将PTRPTR左边的类属性赋给右边的变量或标号。左边的类属性赋给右边的变量或标号。PTRPTR本身并不分配存储本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,以保证运算时操作数类型的匹配,单元,仅给已分配的存储单元赋予新的属性,以保证运算时操作数类型的匹配,常与类型常与类型BYTEBYTE、WORDWORD、NEARNEAR、FARFAR等连用。等连用。3 3THISTHIS 格式:变量格式:变量/ /标号标号 EQU THIS EQU THIS 类型类型/ /距离距离 THIS THIS的功能是将的

21、功能是将EQU THISEQU THIS右边的类型右边的类型/ /距离属性,赋给左边的变量距离属性,赋给左边的变量/ /标号,该标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。变量或标号的段地址和偏移地址与下一个存储单元的地址相同。4 4SHORTSHORT 格式:格式:SHORTSHORT标号标号 SHORTSHORT用来说明转移类指令中转向地址的属性,指出转向的目标地址与本指令用来说明转移类指令中转向地址的属性,指出转向的目标地址与本指令之间的距离在之间的距离在128128127127之间,即限制在短转移范围内。之间,即限制在短转移范围内。5 5HIGHHIGH和和LOWL

22、OW 格式:格式:H1GH/LOWH1GH/LOW变量或标号变量或标号 HIGHHIGH和和LOWLOW称为字节分离运算符,对一个数或地址表达式,称为字节分离运算符,对一个数或地址表达式,HIGHHIGH从中分离出从中分离出高位字节,高位字节,LOWLOW分离出低位字节。分离出低位字节。 六、其它运算符六、其它运算符1 1圆括号圆括号( ) ( ) 圆括号用来改变运算符的优先级别,圆括号用来改变运算符的优先级别,( )( )中的运算符具有最高优先权。中的运算符具有最高优先权。2 2方括号方括号 方括号主要用来表示地址表达式或多重变量的下标值。方括号主要用来表示地址表达式或多重变量的下标值。3

23、3尖括号尖括号,及圆点,及圆点运算符在结构中专用,表示结构中的变量在预置结构付本时是否修改,修运算符在结构中专用,表示结构中的变量在预置结构付本时是否修改,修改成什么数值。改成什么数值。运算符在结构中专用,表示结构付本名与变量名连接在一起,作为预置的结运算符在结构中专用,表示结构付本名与变量名连接在一起,作为预置的结构付本中的各个变量。构付本中的各个变量。4 4MASKMASK和和WIDTHWIDTHMASKMASK与与WIDTHWIDTH运算符在记录中专用。运算符在记录中专用。WIDTHWIDTH为记录名为记录名/ /字段名,运算后返回数值表示指定记录或字段的位的长度。字段名,运算后返回数值

24、表示指定记录或字段的位的长度。MASKMASK为字段名,返回数值为为字段名,返回数值为8 8位位/16/16位二进制数,对应指定字段的各位置位二进制数,对应指定字段的各位置“1”1”,其它位置其它位置“0”0”。 七、优先级七、优先级4.3 4.3 伪指令语句伪指令语句一、数据定义语句一、数据定义语句格式格式1 1:变量名:变量名 助记符助记符 操作数,操作数操作数,操作数 ;注释;注释格式格式2 2:变量名:变量名 助记符助记符 n DUP(n DUP(操作数,操作数操作数,操作数) ) ;注释;注释功能:将操作数存入变量名指定的存储单元中,或者只分配存储空间不存入数功能:将操作数存入变量名

25、指定的存储单元中,或者只分配存储空间不存入数据。据。 变量名变量名它用符号表示,可以省略,作用与指令语句中的标号相同,但后面不它用符号表示,可以省略,作用与指令语句中的标号相同,但后面不跟冒号。汇编程序汇编时将此变量的助记符后的第一个字节的偏移地址作为它的跟冒号。汇编程序汇编时将此变量的助记符后的第一个字节的偏移地址作为它的符号地址。符号地址。助记符助记符所用伪指令助记符主要有:所用伪指令助记符主要有: DBDB:用来定义字节,表示每个操作数占用一个字节。:用来定义字节,表示每个操作数占用一个字节。 DWDW;用来定义字,表示每个操作数占用一个字。;用来定义字,表示每个操作数占用一个字。 DD

26、DD:用来定义双字,表示每个操作数占用两个字。:用来定义双字,表示每个操作数占用两个字。 DQDQ:用来定义四个字,表示每个操作数占用四个字。:用来定义四个字,表示每个操作数占用四个字。 DTDT:用来定义十个字节,表示每个操作数占用十个字节。:用来定义十个字节,表示每个操作数占用十个字节。 二、表达式赋值语句二、表达式赋值语句表达式赋值语句有两种,赋值语句表达式赋值语句有两种,赋值语句EQUEQU和等号语句,它们均不占用内存。和等号语句,它们均不占用内存。1 1赋值语句赋值语句EQUEQU 格式:符号名格式:符号名 EQU EQU 表达式表达式 功能:用来给变量,标号,常数,指令,表达式等定

27、义一个符号名,程序中功能:用来给变量,标号,常数,指令,表达式等定义一个符号名,程序中用到用到EQUEQU左边的变量、标号时可用右边的常数值或表达式代替,但一经定义在同一左边的变量、标号时可用右边的常数值或表达式代替,但一经定义在同一个程序模块中不能重新定义。个程序模块中不能重新定义。2 2等号语句等号语句 等号语句等号语句“”与与EQUEQU语句具有相同功能,区别仅在于语句具有相同功能,区别仅在于EQUEQU中左边的标号不中左边的标号不允许重新定义,而用允许重新定义,而用“”定义的语句允许重复定义。定义的语句允许重复定义。三、段定义语句三、段定义语句1.1.段定义语句段定义语句SEGMENT

28、ENDSSEGMENTENDS 格式格式: : 段名段名 SEGMENT SEGMENT 定位类型定位类型 组合类型组合类型 分类名分类名 逻辑段内容逻辑段内容 段名段名 ENDSENDS 功能:将一个逻辑段定义成一个整体。功能:将一个逻辑段定义成一个整体。 段定义语句中的参数设置,可以增强伪指令语句的功能。段定义语句允许嵌套段定义语句中的参数设置,可以增强伪指令语句的功能。段定义语句允许嵌套设置,即一个逻辑段内再设置其它逻辑段,但不允许各个逻辑段相互交叉设置。设置,即一个逻辑段内再设置其它逻辑段,但不允许各个逻辑段相互交叉设置。2.2.段分配语句段分配语句(ASSUME)(ASSUME) 在

29、在8086/80888086/8088系统中存储器采用分段结构,各段容量系统中存储器采用分段结构,各段容量64KB64KB,用户可以设置,用户可以设置多个逻辑段,但只允许多个逻辑段,但只允许4 4个逻辑段同时有效,段分配语句用来完成将逻辑段分别个逻辑段同时有效,段分配语句用来完成将逻辑段分别定义成代码段,数据段,堆栈段及附加段。定义成代码段,数据段,堆栈段及附加段。格式:格式:ASSUME CSASSUME CS:段名,:段名,DSDS:段名,:段名,SSSS:段名,:段名,ESES:段名:段名 功能:定义功能:定义4 4个逻辑段,指明段与段寄存器的关系。个逻辑段,指明段与段寄存器的关系。AS

30、SUME NOTHING ASSUME NOTHING 可以取消前面由可以取消前面由ASSUMEASSUME所指定的段寄存器。所指定的段寄存器。例:两个例:两个1616位无符号二进制数相乘。位无符号二进制数相乘。DATA SEGMENTDATA SEGMENT D1 DW 1234H D1 DW 1234H D2 DW 5678H D2 DW 5678H P1 DD ? P1 DD ? P2 DD ? P2 DD ?DATA ENDSDATA ENDSSTACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100 DUP(?) DW 100

31、DUP(?)STACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARMAIN PROC FARSTART:MOV AX,STACKSTART:MOV AX,STACK MOV SS,AX MOV SS,AX PUSH DS PUSH DS SUB AX,AX SUB AX,AX PUSH AX PUSH AX MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX L1: MOV

32、 AX,D1 L1: MOV AX,D1 MUL D2 MUL D2 MOV BX,OFFSET P1 MOV BX,OFFSET P1 MOV BX,AX MOV BX,AX MOV BX+2,DX MOV BX+2,DX RET RETMAIN ENDPMAIN ENDPCODE ENDSCODE ENDS END START END START四、过程定义语句四、过程定义语句 过程也称作子程序。在主程序中,经常要用到一些程序段,程序段的功能过程也称作子程序。在主程序中,经常要用到一些程序段,程序段的功能和结构相同,仅有一些变量赋值不同,此时可以将这些程序段独立编写,用过和结构相同,仅有一

33、些变量赋值不同,此时可以将这些程序段独立编写,用过程定义语句进行定义,然后在主程序中对它进行过程调用。程定义语句进行定义,然后在主程序中对它进行过程调用。 格式:过程名格式:过程名 PROC PROC 属性属性 过程内容过程内容 RET NRET N 过程名过程名 ENDPENDP 功能:定义一个过程,主程序可以用功能:定义一个过程,主程序可以用CALLCALL指令调用它。指令调用它。 过程名过程名是给所定义的过程取的名字,不可缺省。它是主程序调用是给所定义的过程取的名字,不可缺省。它是主程序调用(CALL(CALL指令指令) )的目标操作数,即子程序人口的符号地址。像标号一样过程名具有三种属

34、的目标操作数,即子程序人口的符号地址。像标号一样过程名具有三种属性:性: 段属性:为该过程所在段的段基址。段属性:为该过程所在段的段基址。 偏移地址属性:指该过程第一个字节与段首址之间距离字节。偏移地址属性:指该过程第一个字节与段首址之间距离字节。 距离属性为:距离属性为:NEARNEAR或或FARFAR。格式中的属性就指距离属性,定义。格式中的属性就指距离属性,定义NEARNEAR允许过程允许过程在段内调用,定义在段内调用,定义FARFAR允许过程在段间调用,允许过程在段间调用,NEARNEAR为缺省使用。为缺省使用。 五、程序开始和结束语句五、程序开始和结束语句1.NAME1.NAME 格

35、式:格式:NAME NAME 程序名程序名 功能:为源程序目标模块赋名字。功能:为源程序目标模块赋名字。 NAMENAME为伪指令助记符,放在程序开始,在输出汇编语言源程序的列表文为伪指令助记符,放在程序开始,在输出汇编语言源程序的列表文件时,将在每一页的开头打印出该程序名。若源程序中省略件时,将在每一页的开头打印出该程序名。若源程序中省略NAMENAME伪指令,汇编程伪指令,汇编程序将源文件名作目标模块的名字。序将源文件名作目标模块的名字。 2.ORG2.ORG 格式:格式:ORG ORG 表达式表达式 功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址功能:给汇编程序设置位置指针,指

36、定下面语句的起始偏移地址 ORGORG是伪指令助记符,不可缺省。是伪指令助记符,不可缺省。 表达式表达式给定的偏移地址值,表达式的计算结果必须是正整数。一般情给定的偏移地址值,表达式的计算结果必须是正整数。一般情况下段定义语句指出了段的起点,偏移地址为况下段定义语句指出了段的起点,偏移地址为0 0,段内各个语句或数据的地址由,段内各个语句或数据的地址由段地址开始依次类推可确定。当用户要求指定某条指令或数据为某个指定地址时,段地址开始依次类推可确定。当用户要求指定某条指令或数据为某个指定地址时,可用可用ORGORG语句来改变,语句来改变,ORGORG语句可以放在程序的任何位置。语句可以放在程序的

37、任何位置。 3.END3.END 格式:格式:END END 标号名标号名 功能:标记汇编源程序结束。功能:标记汇编源程序结束。 ENDEND是伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只是伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只有一个有一个ENDEND,汇编程序到,汇编程序到ENDEND语句停止汇编。语句停止汇编。 标号名标号名是该程序中第一条可执行语句的标号名,可以缺省,若一个程是该程序中第一条可执行语句的标号名,可以缺省,若一个程序包含多个模块,序包含多个模块,ENDEND后面带的标号为主程序模块中的标号名称。后面带的标号为主程序模块中的标号名称。 六、结构定

38、义语句六、结构定义语句1.1.结构定义结构定义 格式:结构名格式:结构名 STRUCSTRUC ( (用用DBDB,DWDW,DDDD等语句定义结构中数据变量等语句定义结构中数据变量) ) 结构名结构名 ENDSENDS 功能功能: :结构定义语句可以把各种不同类型的数据放在同一个数据结构中,便结构定义语句可以把各种不同类型的数据放在同一个数据结构中,便于某些数据处理的需要。于某些数据处理的需要。 结构名结构名结构定义的名称结构定义的名称, ,不可缺省,在不可缺省,在STRUCSTRUC与与ENDSENDS前的结构名要相同,前的结构名要相同,不允许超前引用。不允许超前引用。 STRUCENDS

39、STRUCENDS结构定义伪指令助记符,不可缺省,必须成对出现。结构定义伪指令助记符,不可缺省,必须成对出现。 结构中数据变量用结构中数据变量用DBDB,DWDW,DDDD等变量定义语句进行定义,定义后的结构未分等变量定义语句进行定义,定义后的结构未分配存储空间,结构中各个变量具有各自的局部偏移量,它是指各变量的第一字节配存储空间,结构中各个变量具有各自的局部偏移量,它是指各变量的第一字节与结构起始地址之间的字节距离。它们的类型属性取决于所采用的变量定义语句。与结构起始地址之间的字节距离。它们的类型属性取决于所采用的变量定义语句。只有在结构被预置后,才有确定的存储单元位置。只有在结构被预置后,

40、才有确定的存储单元位置。2 2结构付本预置结构付本预置 结构定义后,在汇编过程中不产生目标代码,也不分配存储空间,必须先预结构定义后,在汇编过程中不产生目标代码,也不分配存储空间,必须先预置结构付本,汇编程序给每个结构付本分配存储空间置结构付本,汇编程序给每个结构付本分配存储空间, ,此时结构中的变量才与存此时结构中的变量才与存储单元发生关联。结构中允许修改的变量在不同的结构付本中可被修改成不同的储单元发生关联。结构中允许修改的变量在不同的结构付本中可被修改成不同的数值。数值。 预置结构付本的格式有如下两种。预置结构付本的格式有如下两种。 格式格式1 1:结构付本名:结构付本名 结构名结构名

41、;注释;注释 格式格式2 2:结构付本名:结构付本名 结构名结构名 N DUP (N DUP () ) ;注释;注释 结构付本名结构付本名是给所预置的结构付本起的名字,可以缺省。是给所预置的结构付本起的名字,可以缺省。 结构名结构名与结构定义时的结构名相同,不可缺省。与结构定义时的结构名相同,不可缺省。 尖括号尖括号为专用运算符,表示在预置付本时,结构中的变量改成什么值,为专用运算符,表示在预置付本时,结构中的变量改成什么值,也可以不进行修改。也可以不进行修改。 尖括号中的元素值,可以缺省,表示此结构付本对原结构中的所有变量不进尖括号中的元素值,可以缺省,表示此结构付本对原结构中的所有变量不进

42、行修改。若有多个元素值,它们之间用逗号分开,对不修改的变量用逗号表示,行修改。若有多个元素值,它们之间用逗号分开,对不修改的变量用逗号表示,修改的元素值用修改量代替,其后序变量保持不变时,可不再写元素值。修改的元素值用修改量代替,其后序变量保持不变时,可不再写元素值。 若用第二种格式预置结构付本,若用第二种格式预置结构付本,N N表示需要预置相同的结构付本的个数。表示需要预置相同的结构付本的个数。七、外部伪指令和对准伪指令七、外部伪指令和对准伪指令 1 1外部伪指令外部伪指令 程序中包含多个模块时,有些程序或数据在各个模块间要相互共享,可用外程序中包含多个模块时,有些程序或数据在各个模块间要相

43、互共享,可用外部伪指令部伪指令PUBLICPUBLIC和和EXTRNEXTRN来实现此功能。其中来实现此功能。其中PUBLICPUBLIC用来定义共享模块,用来定义共享模块,EXTRNEXTRN用用来调用共享模块。来调用共享模块。格式:格式: PUBLIC PUBLIC 名称,名称,名称,名称, ;注释;注释 EXTRN EXTRN 名称:类型,名称:类型,名称:类型,名称:类型, ;注释;注释 2 2对准伪指令对准伪指令格式:格式:EVENEVEN功能:功能:EVENEVEN伪指令使下一语句的地址调整为偶地址。伪指令使下一语句的地址调整为偶地址。EVENEVEN直接放在某一语句前,汇编程序汇

44、编时就会完成将地址调整在偶地址上。直接放在某一语句前,汇编程序汇编时就会完成将地址调整在偶地址上。地址计数器的值地址计数器的值$表示当前正在汇编的指令的地址表示当前正在汇编的指令的地址 。3.LABEL3.LABEL LABEL LABEL伪指令给已定义的变量或标号取另一个名字,并可重新定义它的类伪指令给已定义的变量或标号取另一个名字,并可重新定义它的类型属性,使同一变量或标号在不同地方被引用时,可采用不同的名字,具有型属性,使同一变量或标号在不同地方被引用时,可采用不同的名字,具有不同的类型属性,这样提高了程序的灵活性。不同的类型属性,这样提高了程序的灵活性。 格式:名称格式:名称 LABE

45、L LABEL 类型属性类型属性 名称名称为为LABELLABEL语句下一行所使用的语句中的变量或标号取的别名。语句下一行所使用的语句中的变量或标号取的别名。 LABELLABEL伪指令助记符,不可缺省。伪指令助记符,不可缺省。 类型属性类型属性规定了所起别名的变量或标号的类型,此别名与原变量标规定了所起别名的变量或标号的类型,此别名与原变量标号具有相同的段基址及偏移地址。号具有相同的段基址及偏移地址。八、八、 高档微机增加的伪指令高档微机增加的伪指令模型方式的基本格式如下;模型方式的基本格式如下; MODEL SMALL MODEL SMALL ;存储格式伪指令;存储格式伪指令 STACK

46、STACK ;堆栈段定义;堆栈段定义 DATADATA . . ;数据定义;数据定义 CODECODE STARTUP STARTUP ;程序开始伪指令;程序开始伪指令 . . ;程序代码;程序代码 EXIT 0 EXIT 0 ;程序结束伪指令;程序结束伪指令 . . ;子程序代码;子程序代码 END END ;汇编结束伪指令;汇编结束伪指令 4.4 DOS4.4 DOS系统功能调用和系统功能调用和BIOSBIOS中断调用中断调用一、一、DOSDOS功能调用功能调用 DOSDOS系统功能调用分别实现设备管理、文件读写、文件管理和目录管理等系统功能调用分别实现设备管理、文件读写、文件管理和目录管

47、理等功能。每个子程序对应一个功能号,所有的系统功能调用的格式是一致的,按功能。每个子程序对应一个功能号,所有的系统功能调用的格式是一致的,按下面下面4 4步进行:步进行: (1) (1)系统功能号送到系统功能号送到AHAH寄存器中;寄存器中; (2)(2)入口参数送到指定寄存器中;入口参数送到指定寄存器中; (3)(3)用用1NT 21H1NT 21H指令执行功能调用;指令执行功能调用; (4)(4)根据出口参数分析功能调用执行情况。根据出口参数分析功能调用执行情况。 有些系统功能调用比较简单,不需要设置人口参数或者没有出口参数。有些系统功能调用比较简单,不需要设置人口参数或者没有出口参数。D

48、OSDOS系统功能调用的功能及入口系统功能调用的功能及入口/ /出口参数表,详细见附录出口参数表,详细见附录F F。1.DOS1.DOS键盘功能调用键盘功能调用 例例: : 开辟一个缓冲区,从键盘输入一个字符串,将输入的字符数开辟一个缓冲区,从键盘输入一个字符串,将输入的字符数CLCL寄存器寄存器, ,并并将指针指向字符串的第一个字符。将指针指向字符串的第一个字符。 BUFF DB 100BUFF DB 100 DB ? DB ? DB 100 DUP(?) DB 100 DUP(?)MOV AX,DATAMOV AX,DATAMOV DS,AXMOV DS,AXMOV DX,OFFSET B

49、UFFMOV DX,OFFSET BUFFMOV AH,0AHMOV AH,0AHINT 21HINT 21HMOV BX,DXMOV BX,DXMOV CL,BX+1MOV CL,BX+1ADD DX,2ADD DX,22.DOS2.DOS显示功能调用显示功能调用3.DOS3.DOS打印功能调用打印功能调用 5 5号功能调用完成将号功能调用完成将DLDL寄存器中的字符送到打印机,若需要回车换行,也寄存器中的字符送到打印机,若需要回车换行,也同样将回车换行的字符码送到同样将回车换行的字符码送到DLDL寄存器。寄存器。4.4.日期与时间设置日期与时间设置 5.5.异步通讯异步通讯6.6.返回操作

50、系统返回操作系统 4CH4CH功能调用能够结束当前正在执行的程序,返回操作系统,屏幕显示操作功能调用能够结束当前正在执行的程序,返回操作系统,屏幕显示操作提示符。提示符。 MOV AHMOV AH,4CH4CH INT 21H INT 21H 此功能调用无入口参数。此功能调用无入口参数。 二、二、BIOSBIOS中断调用中断调用 驻留在驻留在ROMROM中的中的BI0SBI0S提供了系统加电自检,引导装入提供了系统加电自检,引导装入I/0I/0设备的处理程序及接设备的处理程序及接口控制等功能模块来处理所有的系统中断。与口控制等功能模块来处理所有的系统中断。与DOSDOS功能调用相同,用户可以直

51、接功能调用相同,用户可以直接用指令设置参数,然后中断调用用指令设置参数,然后中断调用BIOSBIOS中的程序。中的程序。 4.5 4.5 程序设计方法程序设计方法 一般来说设计汇编语言源程序的基本步骤如下:一般来说设计汇编语言源程序的基本步骤如下:(1)(1)分析问题,抽象出描述问题的数学模型,并确定实现数学模型的算法。分析问题,抽象出描述问题的数学模型,并确定实现数学模型的算法。(2)(2)绘制程序流程图,通常先画粗框图,在结构模块中再画细框图。框图一般有起绘制程序流程图,通常先画粗框图,在结构模块中再画细框图。框图一般有起始框,执行框,判断框和终止框,如下图示:始框,执行框,判断框和终止框

52、,如下图示: (3)(3)分配存储空间及工作单元。分配数据段,堆栈段,程序段各在内存什么位置,分配存储空间及工作单元。分配数据段,堆栈段,程序段各在内存什么位置,各个寄存器主要做什么用。各个寄存器主要做什么用。(4)(4)按流程图设计编写程序。按流程图设计编写程序。(5)(5)静态检查,上机调试。静态检查,上机调试。( (一般分段调试较好一般分段调试较好) )(6)(6)程序运行,结果分析。程序运行,结果分析。 在进行汇编语言源程序设计时,通常用到四种程序结构:顺序结构,分支在进行汇编语言源程序设计时,通常用到四种程序结构:顺序结构,分支结构,循环结构,子程序结构。结构,循环结构,子程序结构。

53、 一、顺序结构一、顺序结构 顺序结构的程序一般是简单程序,程序顺序执行,无分支,无循环,也无转顺序结构的程序一般是简单程序,程序顺序执行,无分支,无循环,也无转移,图中没有判断框。移,图中没有判断框。 例:内存中例:内存中TABLETABLE开始存放开始存放0 09 9的平方值,通过人机对话,当任给定一个数的平方值,通过人机对话,当任给定一个数X(0X(09)9),查表得,查表得X X的平方值,放在的平方值,放在ALAL中。中。 MODEL SMALIMODEL SMALI 386386 STACK 100HSTACK 100H DATADATA TABLE DB 0 TABLE DB 0,1

54、 1,4 4,9 9,1616,2525,3636,4949,6464,8181 BUF DBP1ease input One number(09) BUF DBP1ease input One number(09):,0DH0DH,0AH0AH, $ CODE CODE STARTUP STARTUP ;说明程序起点,设置;说明程序起点,设置DS-SSDS-SS MOV DX MOV DX,OFFSEOFFSE丁丁BUF BUF ;9 9号功能调用,提示输入一个数号功能调用,提示输入一个数 MOV AHMOV AH,9 9 INT 21H INT 21H MOV AH MOV AH,1 1

55、;1 1号功能调用,键人数送人号功能调用,键人数送人ALAL INT 21H INT 21H AND AL AND AL,0FH0FH MOV BX MOV BX,OFFSET TABLE OFFSET TABLE MOV AH MOV AH,0 0 ;查表得输人数得平方值;查表得输人数得平方值 ADD BXADD BX,AXAX MOV AL MOV AL,BX BX ;保存查表结果到;保存查表结果到ALAL EXIT 0EXIT 0 END END二、分支结构二、分支结构1.1.分支结构分支结构 一般情况下,程序顺序执行,但经常要求程序根据不同条件选择不同的处理一般情况下,程序顺序执行,但

56、经常要求程序根据不同条件选择不同的处理方法,这就需要用到分支结构,分支结构如下图所示。方法,这就需要用到分支结构,分支结构如下图所示。 2.2.多分支结构多分支结构 有的分支结构为多分支,可以利用多个条件转移指令来实现,依次测试条件有的分支结构为多分支,可以利用多个条件转移指令来实现,依次测试条件是否满足,若满足转入相应分支人口,若不满足继续向下测试,直到全部测试完。是否满足,若满足转入相应分支人口,若不满足继续向下测试,直到全部测试完。这种方法编程简单,直观,但运行速度慢,要依次检查才能进入要求的人口。这种方法编程简单,直观,但运行速度慢,要依次检查才能进入要求的人口。例:有例:有8 8个加

57、工子程序,人口地址分别为个加工子程序,人口地址分别为P1P1,P2P2,P8P8。编程实现检测键盘输入。编程实现检测键盘输入命令,使系统分别转向命令,使系统分别转向8 8个加工子程序。个加工子程序。 MOV AHMOV AH,1 1 INT 21H INT 21H ;1 1号功能调用,键盘接收号功能调用,键盘接收 CMP ALCMP AL,l l ;键值为;键值为1 1,转,转1 1号加工子程序号加工子程序 JE PlJE Pl CMP AL CMP AL,2 2 ;键值为;键值为2 2,转,转2 2号加工子程序号加工子程序 JE P2JE P2 CMP AL CMP AL,88 JE P8

58、JE P8 ;键值非;键值非1 18 8,转向停止,转向停止 JMP STJMP ST P1 P1: ;1 1号加工子程序号加工子程序 P8P8: ST ST: HLTHLT3.3.跳转表实现多分跳转表实现多分 利用跳转表实现多分支,就克服了上面方法的缺点,可以直接找到相应人口。利用跳转表实现多分支,就克服了上面方法的缺点,可以直接找到相应人口。利用这种方法要在存储器中先建立一个跳转表,表中包括每个分支的人口地址,利用这种方法要在存储器中先建立一个跳转表,表中包括每个分支的人口地址,跳转指令或关键字,利用此表就可实现分支结构。跳转指令或关键字,利用此表就可实现分支结构。(1)(1)根据表内地址

59、分支根据表内地址分支 跳转表中存放了每个分支程序的人口地址,只要找到表地址,再将其中内容跳转表中存放了每个分支程序的人口地址,只要找到表地址,再将其中内容取出,即可得到每个分支的人口地址。取出,即可得到每个分支的人口地址。 表地址跳转表首地址表地址跳转表首地址+ +偏移地址偏移地址 图图(a)(a)给出了跳转表在内存中的存放方法,图给出了跳转表在内存中的存放方法,图(b)(b)给出了按表地址分支的流程图。给出了按表地址分支的流程图。例:将上例中程序改成用跳转表来实现例:将上例中程序改成用跳转表来实现 BASE DW P1BASE DW P1,P2P2,P3P3,P4 P4 ;定义跳转表;定义跳

60、转表 DW P5DW P5,P6P6,P7P7,P8P8 KEY DB KEY DB ? MOV AHMOV AH,1 1 ;键值在;键值在ALAL中中 INT 21HINT 21H AND AL AND AL,OFHOFH MOV BX MOV BX,OFFSET BASE OFFSET BASE ;取首地址;取首地址 MOV AHMOV AH,0 0 ADD AL ADD AL,ALAL ADD BX ADD BX,AX AX ;求表地址;求表地址 JMP WORD PTRBX JMP WORD PTRBX ;转入相应入口地址;转入相应入口地址 :(2)(2)根据表内指令分支根据表内指令分

温馨提示

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

评论

0/150

提交评论