《pc汇编语言程序设计课件_第5章_基本汇编语言》由会员分享,可在线阅读,更多相关《pc汇编语言程序设计课件_第5章_基本汇编语言(157页珍藏版)》请在金锄头文库上搜索。
1、第五章 基本汇编语言,5.1 汇编语言的语句 5.2 汇编语言的表达式和运算符 5.3 伪指令语句 5.4 指令语句 5.5 汇编语言程序的格式 5.6 汇编语言程序的上机过程 习题五,5.1 汇编语言的语句,5.1.1 汇编语言的语句分类汇编语言源程序中可以使用三类语句, 它们分别是:(1) 指令语句。这类语句又称机器指令语句, 其经汇编后能产生相应的目的码,或称机器代码,这些代码能被CPU直接识别并执行相应的操作。例如:第四章中已作过介绍的MOV, SUB, CMP, XOR等指令均属机器指令语句。,(2) 伪指令语句。这类语句指示汇编程序在汇编源程序时完成某些工作,比如给变量分配内存单元
2、地址,给某个符号赋一个值等。伪指令语句与指令语句的最大区别是:伪指令语句经汇编后不产生机器代码,而指令语句经汇编后会产生相应的机器代码;其次伪指令语句所指示的操作是在程序汇编时完成的, 而指令语句的操作必须在程序运行时才能完成。 例如,第四章介绍的数据定义伪指令DB,DW就属伪指令语句。,(3) 宏指令语句。在8088/8086和80X86系列的汇编语言中,允许用户将多次重复使用的程序段定义为宏。宏的定义必须按相应的规定进行,每个宏都有相应的宏名。在程序的任意位置, 若需要使用这段程序只要在相应的位置使用宏名,即相当于使用了这段程序。 因此,宏指令语句就是宏的引用。宏的引用语句就是宏指令语句。
3、有关宏的详细介绍见第十章。,5.1.2 汇编语言的语句格式,1 名字项(1) 名字项的名称和含义。在三类语句中,名字项有不同的名称和含义。名字项出现在指令语句或宏指令语句前时,称该名字项为标号且对应的标识符后面必须跟有冒号, 标号在汇编以后分配有地址。因此,标号可以用来指示指令代码在内存中的地址。标号又称为符号地址,可作为转移指令或子程序调用指令的目标地址。 若名字项出现在伪指令语句前,则该名字项称为符号名,根据不同的伪指令,这些符号名又可分为变量名、符号常数名、 子程序名或段名等。,(2) 名字项的书写规则。名字项的书写有严格的规定, 它可使用下列字符: 字母 AZ、 az数字 09特殊字符
4、 ?、 、 、- 、 等名字项的第一个字符必须是字母或特殊字符, 从第二个字符起可以跟字母、 数字、特殊字符,但是问号本身不能单独作为名字, 名字最多由31个字符组成,多则无效。 需要注意的是,名字不能使用汇编语言的专用保留字, 8088/8086汇编语言中的指令助记符,寄存器名,伪指令名,表达式中使用的运算符和属性运算符等均不能作为名字项,否则汇编时会给出错误信息。另外,名字项在程序中不能重复定义。,(3) 名字项的属性。名字项中标号和变量都有相应的属性, 分别介绍如下: 标号的属性。 标号一般出现在指令语句前面,它表示指令的符号地址, 指示汇编后该指令代码在内存中位置。因此,它有三种属性:
5、 段属性、偏移属性和类型属性。 段属性:表示该标号的段起始地址,且该地址一定是在CS段寄存器中。 偏移属性:表示标号在代码段中的段内偏移地址,是一个 16 位的无符号数,表示从段起始地址开始到定义标号的位置之间的距离(字节数)。 类型属性:表示该标号是在本段内引用,还是在其它段中引用。在段内引用的标号为NEAR属性,在段外引用的标号为FAR属性。, 变量的属性。 变量经常作为操作数出现在各种语句中,变量是在除代码段以外的段中用伪指令进行定义的,定义变量实际上就是给变量分配内存单元,因此,变量也有三种属性:段属性、偏移属性和类型属性。 段属性:表示变量所在段的起始地址。该地址值必须在除代码段以外
6、的其它段寄存器中。 偏移属性:表示变量在段内的偏移地址,即从段的起始地址开始到变量所对应的内存单元之间的字节数,用16位无符号表示偏移地址。 类型属性:表示该变量能存放的数据长度,它与变量定义时使用的伪指令有关。长度为1个字节的类型属性为BYTE, 长度为2个字节的类型属性为WORD等。同一个标号或变量的定义在一个程序中只允许一次, 否则会出现重复定义错误。,(4) 符号常数。当名字项出现在EQU伪指令或“”语句之前时,称该名字项为符号常数。程序中用符号名代表一个常数或表达式值, 可以增加程序的可读性。符号常数经常在表达式中使用,也可单独作为操作数出现在语句中。字符常数没有上述的属性问题。,2
7、 操作项操作项表示语句要实现的具体操作,可以是指令、伪指令、 宏指令语句的助记符。 汇编程序对于上述三类语句会作不同的处理。对于指令语句,汇编程序会将它翻译成二进制指令代码; 对于伪指令语句,汇编程序会按其意义完成汇编;对于宏指令语句, 汇编程序将其展开,也就是用宏体替代原来的宏指令语句。,3 操作数项操作数项根据不同的语句由一个或多个表达式组成,两个以上的表达式之间要用逗号分开。操作项的常见形式有:常数、 寄存器、 标号、 变量或表达式。其中,表达式是由常数、变量、 标号通过操作数运算符连接而成的式子。需要注意的是:表达式的值是在汇编的过程中计算出来的,根据表达式中的成分,计算出来的结果可能
8、是操作数的地址值,也可能就是操作数。 下面先介绍常数。 运算符、表达式、变量和标号的详细介绍见5.2和5.3节。 汇编语言的常数(或称常量)概念与高级语言相同, 允许使用以下三种常数:,(1) 数值常数。数值常数分为整数和实数。分别介绍如下; 整数的表示方法。 整数可以使用二进制、八进制、十进制或十六进制的数来表示,为了区分不同的数制,在数的末尾加后缀字母以区分。 后缀字母“B”(Byte),表示它前面的数是二进制的,字母 “O”(Octal)或“Q“表示它前面的数是八进制的,字母“D”(Decimal) 表示它前面的数是十进制的,不加字母“D”也默认为是十进制的数,字母“H”(Hexadec
9、imal)表示它前面的数是十六进制的。后缀字母也同样适用于地址(段内偏移地址)。,当操作数或地址(段内偏移地址)使用十六进制数表示时, 若数的最高位以字母AF开头,则必须在它前面加一个0。这样可以使数或地址避免与变量、标号或寄存器名混淆。 例如,要给寄存器AL送一个十六进制的数(A)16的指令,数前不加0的指令为:MOV AL, AH,数前加0的指令为 MOV AL, 0AH。 显然,这两条指令执行结果是不同的, 数前加0的指令得到的结果才是所希望的。, 实数的表示方法。 有协处理器(浮点运算器)的主机,在汇编语言程序中还可安排各种实数运算, 实数可以采用两种形式表示,一种是带小数点的十进制数
10、形式。 另一种是指数形式,其格式为: 整数部分.小数部分E指数部分。例如:576.3,-312.125, 1.2E-1,37.54E+5都是正确的实数形式。,实数在存储器中以浮点数的形式存储,根据存储实数所用的字节数,又可分为短实数格式(又称单精度浮点数),长实数格式(又称双精度浮点数)和暂存实数格式(又称扩展精度数)。它们分别占用4个字节、 8个字节和10个字节。 若想在内存中预先定义上述三种实数必须使用DD, DQ和DT伪指令。 (DD,DQ和DT为数据定义伪指令, 本章稍后将进一步介绍。 )例如: DAT1 DD -245.6 ; 定义短实数 DAT2 DQ 3578.41 ; 定义长实
11、数 DAT3 DT -1.23E-5 ; 定义暂存实数,(2) 字符串常数。 字符串常数是指用单引号括起来的一个字符或多个字符的序列。使用时可以在单引号内直接写字符序列, 也可以写字符的ASCII码,但ASCII码之间必须用逗号作分隔(此时不需要用单引号)。 例如, MOV AH, A指令和MOV AH, 41H指令是等价的。 (3) 符号常数。符号常数是指用EQU伪指令或赋值语句“=”定义过的符号名,可作操作数项或在表达式中使用。,4 注释项注释项不是语句的必要部分。它主要用来说明一个程序、 一段程序或重要的指令的功能,增加程序的可读性。对于较大的程序,注释项更不能少,有了注释, 程序易读,
12、也便于日后修改和维护。 注释项可以独立存在于程序中,但必须以分号开头。汇编程序对于分号后面的内容不予汇编。利用注释项的这个特点, 在调试程序中, 也可将分号加到指令前,以暂时冻结有疑问的指令,调试正确后,再对这些指令解冻或删除, 这样可以减少语句增、 删的编辑工作。,5.2 汇编语言的表达式和运算符,汇编语言中,表达式是操作数项的常见形式, 它们经常出现在指令或伪指令语句中。表达式是由常数、变量、 标号通过运算符连接而成的。 需要提醒初学者的是:表达式中一般不允许出现寄存器,只有某些能存放段内偏移地址的寄存器才允许出现在表达式中。例如, SI, DI, BP, BX等。 另外,表达式的值只计算
13、一次, 在汇编时完成, 而不是在程序运行时完成。 例如:,X5 XX5 ; 赋值语句在循环体中 ,5.2.1 算术运算符算术运算符有、 *、 /、 MOD以及只能出现在表达式中的SHR和SHL运算符。其中, 、 、 *、 /是最常用的运算符, 要求参加运算的数(或地址)均为整数, 运算的结果也为整数, 除法运算的结果是商的整数部分。 MOD运算的结果是前一个操作数除以后一个操作数得到的余数, 如15 MOD 2的结果为1。 ,出现在表达式中的SHR和SHL运算符其使用时的格式为: 表达式SHR次数或表达式SHL次数。其作用是在汇编时将表达式的值右移或左移指定的次数,然后作为一个操作数。例如:,
14、尽管算术运算符可以用在数值表达式或地址表达式中, 但在具体使用时仍要注意运算结果的物理意义是否正确。例如, 两个地址相除是无意义的,两个不同段的段基址相加、减是无意义的。另外还要注意运算对象的正确性,如: MOV AX, DX SHL 2指令中的第2个操作数项DX SHL 2是非法的,因为DX不能存放偏移地址。若DAT为已定义过的某个字节的符号, 那么MOV BL,DAT1指令中的第2个操作数是正确的,它表示要将DAT单元的地址加1,然后再将该数取出来传送给BL寄存器。,5.2.2 逻辑运算符逻辑运算符依次为NOT, AND,OR和XOR。 逻辑运算是按位进行操作的,位与位之间没有进位和借位。
15、其中,NOT运算符是单操作数运算符,其余三个运算符是双操作数运算符。提请读者注意的是,出现在表达式中的上述运算符不是指令,运算符指定的运算是在汇编时完成的, 而指令是在程序运行时完成的。 例如:MOV AL, NOT 0F0H MOV BH, 0F0H AND 0FH,上述两条指令汇编后与下面两条指令等效: MOV AL, 0FH MOV BH, 0,5.2.3 关系运算符关系运算符有六种,它们用于两个表达式值的比较,表达式的值一定是常数或是同一段内的偏移地址,比较的结果为逻辑值,关系成立, 结果为真, 用全“1”表示。 反之结果为假, 用全“0”表示。 六种关系运算符分别是: EQ 相等(E
16、qual)NE 不等(Not equal)LT 小于(Less)LE 小于或等于(Less or Equal)GT 大于(Greater)GE 大于或等于(Greater or Equal),例如: MOV AL,5 EQ 3 MOV DH,5 GT 3汇编后分别等效于:MOV AL, 0 MOV DH, 0FFH若有两个数据类型相同的符号地址X和Y,在DB伪指令中, 则V DB X GT Y 汇编时,当X的偏移地址大于Y的偏移地址时,变量V的内容为0FFH,反之其内容为0。,5.2.4 数值返回运算符数值返回运算符有五种,这些运算符的运算对象必须是变量或标号,其运算结果是变量或标号的特征值(类型属性值)或是它们对应的内存单元地址(段基址或段内偏移地址)。 带有上述运算符的表达式, 其格式可统一表示为: 运算符变量名或标号下面介绍五种数值返回运算符。,