1、汇编语言汇编语言(8学时学时)第二节第二节 数据表示数据表示第一节第一节 基本概念基本概念 知知 识识 概概 述述 第三第三节节 例题及操作例题及操作 第四节第四节 汇编语言的基本元素汇编语言的基本元素 第五节第五节 说明性语句说明性语句 第六节第六节 微处理器的基本指令集微处理器的基本指令集第七节第七节 COM文件的编程文件的编程 第八节第八节 宏宏 第九节第九节 算术协处理器算术协处理器 退 出 第十节第十节 CPU扩展指令集扩展指令集 第十一节第十一节 Win32汇编语言的编程汇编语言的编程第一节第一节 基本概念(基本概念(4学时)学时)3.1.1 汇编语言的由来汇编语言的由来退 出汇编
2、语言:汇编语言的语句和其语法规则。一、机器指令一、机器指令 机器指令:它是计算机能识别的一组二进制代码,用于指出计算机所要进行的操作以及操作对象,是在设计CPU时,就已确定的编码。例如:1.把数“16”送到寄存器AL中,用下列机器指令实现:10110000 00010000 操作码 操作数3.1.1 2.把数“4”与寄存器AL的内容相加,结果仍放在AL中,用下列机器指令实现:00000100 00000100 操作码 操作数 3.把寄存器AL的内容送到地址为6的单元中,用下列机器 指令实现:10100010 00000110 00000000 操作码 操作数地址 不同的机器操作,由不同的代码指
3、令实现。一个计算机能够执行的所有代码指令的集合,就是该计算机的指令系统。退 出3.1.1二、机器语言与机器语言程序二、机器语言与机器语言程序 1.机器语言:把指令系统及书写代码程序的语法规则称为机器语言。2.机器语言程序:用机器语言编写的程序称为机器语言程序。三、汇编语言三、汇编语言 由于机器指令难于使用,人们采用符号代替二进制代码,于是产生了符号化的汇编语句。例如:机器指令 汇编语句10110000 00010000 MOV AL,1600000100 00000100 ADD AL,4 10100010 00000110 00000000 MOV ADDR6,AL退 出3.1.1 四、高级
4、语言四、高级语言 这里仍用相同的两个数的加法运算为例,用机器语言、汇编语言、高级语言实现的语句如下:机器指令 汇编语句 高级语言 10110000 00010000 MOV AL,16 00000100 00000100 ADD AL,4 ADDR6=16+4 10100010 00000110 00000000 MOV ADDR6,AL 1.与汇编语言相比,高级语言有两个主要优点:使用方便。易读、易写、易调试,因而容易学习,编程速度也快。便于移植。程序很容易从一种计算机换到另一种计算机上运行。退 出3.1.1 2.与高级语言相比,汇编语言的优点是:效率高。其程序比相同功能的高级语言程序所占
5、的内存少,运行速度快。能将计算机的全部功能提供给用户使用。这是因 为,汇编语言能最直接最充分地描述计算机语言,使 用汇编语言就是使用机器语言。五、汇编语言的应用领域五、汇编语言的应用领域 要求执行效率高,反应快的领域,如操作系统内 核、工业控制、实时系统;系统频繁使用的子程序或程序段;与硬件资源密切相关的软件开发,如设备驱动程 序等;受内存容量限制的应用领域,如小型控制仪器、仪表。退 出3.1.2 3.1.2 汇编程序汇编程序 汇编程序:它能把用汇编语言编写的源程序翻译成CPU能 识别的机器指令序列。这里,称该翻译程序为 汇编程序。图3.1是一次翻译过程的示意图。退 出第二节第二节 数据表示(
6、数据表示(2学时)学时)3.2.1 十六进制数及十六进制数及Intel惯例惯例退 出一、十六进制数一、十六进制数 十六进制数是逢十六进1位,每一位有16种状态,用0,1,2,9,A,B,C,D,E,F表示。如果十六进制数是以字符开头,为了与字符串区别,须在十六进制数的开头加数码0。3.2.1 二、二、IntelIntel存数的惯例存数的惯例 数据在内存中的存放有两种不同的格式:Big-Endian格式和Little-Endian格式。在Big-Endian格式中,数据的存放原则是:高地址存放低字节,低地址存放高字节。这种存储格式如图3.2所示。在Little-Endia格式中,数据的存放原则是
7、:低地址存放低字节,高地址存放高字节。这种存储格式如图3.3所示。Intel芯片的是按Little-Endia格式存储数据。退 出3.2.2 3.2.2 定点微处理器处理的数据类型定点微处理器处理的数据类型对于Intel系列的8086 CPU能够处理4种类型的数据。一、无符号二进制数一、无符号二进制数 1.8位无符号二进制数 形式:数值 其数值范围:0255(28-1)。2.16为无符号二进制数 形式:数值 其数值范围:065535。3.32为无符号二进制数 形式:数值退 出3.2.2 二、带符号二进制数二、带符号二进制数 带符号的二进制数,其左边的一位(最高位)为符号位,“0”表示正,“1”
8、表示负。带符号的二进制数用补码来表示。1.8位有符号二进制数 形式:S 数码 其数值范围:-128(-27)+127(+(27-1)。2.16位有符号二进制数 15 0 形式:S 数码 其数值范围:-32 768(-215)+32 767(+(215-1)。退 出3.2.2 3.32位有符号二进制数 31 0 形式:S 数码 其数值范围:-2147483648(-231)+2147483647(+(231-1)。三、无符号十进制数三、无符号十进制数BCDBCD码码 无符号十进制数BCD(Binary-Coded Decimal)每位数用4位二进制数表示。显然,4位二进制数中只有09有效。这种数
9、称为BCD码,它的存放形式有两种。退 出3.2.2 1.无符号组合式BCD码 7 0 形式:十位数 个位数 一个字节存放两位十进制数。字节的十进制数 范围:099。例如,34的组合式BCD码为:7 0 0011 0100 书写为:34H 例如,754组合式BCD码为:7 0 7 0 0000 0111 0101 0100 书写为:754H退 出3.2.2 2.2.无符号分离式无符号分离式BCDBCD码码 7 0 形式:uuuu 数码 一个字节存放一位十进制数。字节的十进制数 范围:09。其中u表示任意。例如,34的无符号分离式BCD码形式为:7 0 7 0 uuuu 0011 uuuu 010
10、0 若u位为“0”,书写为:0304H 退 出3.2.2 四、字符数据四、字符数据 用单引号括起来的字符成为字符数据。每个字符占1个字节。在计算机中用该字符对应的ASCII表示。例如,字符数据ABCD在内存中用十六进制表示为 41424344H,可记成:ABCD=41424344H 又如字符数据53,用十六进制表示则为3533H,可记成:53=3533H 寄存器或内存中二进制数码按哪一种数据来理解,其值可能是不同的。例如表3.2中有4个字节的数据,分别按5种数据类型来理解,其值就各不相同。退 出第三节第三节 例题及操作例题及操作 为了较生动地由浅入深地讲述语法,也为了使读者能较快地上机实践,我
11、们这里先介绍一个用汇编语言编写的完整段源程序及其相应的简化段源程序,并简要说明汇编语言程序的上机操作步骤。退 出3.3.1 例题简介例题简介 源程序由语句组成,汇编语句一般可分为三部分,其 一般形式为:名字 指令操作符 操作数1,操作数2,操作数3;注释例3-1计算Z=(X-Y+3),其中X=10,Y=4。汇编语言对大小写不敏感,但是为了区分保留字与标识符,本例中把保留字用大写表示,标识符用非大写标识符表示,以示区分。退 出3.3.1 一、名字与指令操作符一、名字与指令操作符 1.名字:其定义类似于高级语言中的标识符的概念,由用户给出。2.指令的操作符:表示指令的主要操作或功能,通常分为伪操作
12、符与操作符两大类。1)伪操作符:由汇编程序执行的操作。2)操作符:由CPU执行的操作。二、操作数部分二、操作数部分 1.两操作数语句 形式:标号:操作符 目标操作数,源操作数退 出3.3.1 功能:目标操作数(目标操作数)操作(源操作数)操作数可以是变量、寄存器、段名或数据。2.单操作数语句 形式:标号:操作符 操作数 功能:对单个操作数进行操作符规定的操作。这里的操作数同以上说明。3.无操作数语句 形式:标号:操作符 功能:执行操作符规定的操作。从例子可以看出,汇编语言源程序由分段组成。该程序有3个分段。第1个分段是堆栈段,第二个分段是数据段,第3个分段式程序段。退 出3.3.2 3.3.2
13、 上机操作步骤上机操作步骤 汇编语言的运行分下列3个步骤:步骤1:编辑源程序 首先是进入编辑程序,如EDIT.COM,记事本及写字板等编辑软件,键入源程序,正确输入完成后,命名存盘,其中.ASM是汇编程序规定的源文件的扩展名。步骤2:汇编源程序及连接目标程序 汇编语言源程序可适用下列简化命令进行源程序编 译:MASM FILENAME.ASM 如果系统显示出有语法错误,则应在进入编辑程序进行修改。如果系统显示出下列信息:WARNING SEVERE ERRORS ERRORS 00退 出3.3.2 则表示源程序无语法错误,已完成汇编,并得到一个目标文件FILENAME.OBJ。这是可用下列命令
14、进行连接:LINK FILENAME.OBJ 如果有错误信息,则还需要进入编辑程序进行修改。如果无错误,则产生FILENAME.EXE文件。步骤3:运行.EXE文件 运行FILENAME.EXE文件,程序输出结果为9。如果程序结果有误,则可进入DEBUG或CV调试系统中运行、调试。退 出第四节第四节 汇编语言的基本元素(汇编语言的基本元素(2 2学时)学时)3.4.1 3.4.1 符号符号退 出源程序中的符号有两类:一类是保留字(事先由汇编程序约定的,它们不用定义与说明,也不能更改);另一类是名字(由用户定义)。一、保留字一、保留字 1.寄存器名称的约定 2.操作符的约定 3.伪操作符的约定3
15、.4.1 二、名字二、名字 定义名字必须遵守下列规则:名字只能由下列字符组成:字母AZ 数字09 符号$?._ 数字不能作为名字第一个字符。名字的长度可达31个字符,超过部分的字符被系统忽略。符合上面规定的字符组合并且不与任何保留字相同的字符串被认为是合法的名字,否则是非法的名字。常见的名字有以下几种。退 出3.4.11.标号及其属性 标号:是一个冒号“:”引入的名字,它代表所定义语句对应代码指令的开始地址。该地址形式为:该代码段的段地址:偏移地址 标号有3个属性:1)标号的段值属性:标号的段值属性就是标号所在段的段地址。标号的段值属性可写成如下形式:SEG 标号 如SEG START就是ST
16、ART所在代码段的段地址。退 出3.4.1 2)标号的偏移属性:标号的偏移属性是指标号所处位置的偏移地址。标号的偏移属性可写成如下形式:OFFSET 标号 如OFFSET START就是START所在代码段的偏移地址。3)标号的类型属性:标号有FAR与NEAR之分,这个特性称为标号的类型属性,其形式为:TYPE 标号 该属性系统也定义了一个类型值:若为近标号,则(TYPE 标号)=-1 若为远标号,则(TYPE 标号)=-2 对某段来说,远标号表示该标号的定义不在本段。近标号表示该标号的定义在本段。因此,标号的类型是相对的。退 出3.4.1 标号的默认类型为NEAR型,标号的类型是相对的,也就
17、是说,标号的类型是在指令引用它时才确定下来的。2.变量及属性 变量是用数据伪操作符定义的名字。一般数据用下列伪操作符定义:DB每个数据为1个字节。DW每个数据为1个字,即2个字节。DD每个数为1个双字,即4个字节。DQ每个数为8个字节。DT每个数为10个字节。变量有两重含义,它一方面代表所表示的变量的值,另一方面表示变量所占空间的首地址。该地址形式为:所在段的段地址:所在段的偏移地址退 出3.4.1 变量有5个属性:1)变量的段属性 变量的段值属性是指变量定义所在段的段地址。变量的段值属性可写成如下形式:SEG 变量 2)变量的偏移属性 变量的偏移属性是指变量所处位置的偏移地址。变量的偏移属性
18、可写成如下形式:OFFSET 变量 3)变量的类型属性 变量所表示的数据元素的长度(以字节为单位)为变量的类型,其形式为:TYPE 变量 因而“TYPE 变量”这个表达式的值是110之间的数字。退 出3.4.1 4)变量的长度属性 变量所指数据元素的个数为变量的长度属性,其形式为:LENGTH 变量 但是变量的元素个数只对单项的重复子句有意义,对其它变量,LENGTH 变量=1。5)变量的容量属性 变量的容量属性是指变量所表示数据所占空间的字节和,其形式为:SIZE 变量 但是变量的容量属性也只对单项的重复子句有意义,实际上,SIZE 变量的值也可用下式计算:SIZE 变量=(LENGTH 变
19、量)(TYPE 变量)退 出3.4.1 3.段名 用伪操作符SEGMENT定义的名字为段名。段定义形式为:段名SEGMENT 段名ENDS 段名是所定义段的符号化段地址。退 出3.4.1 4.过程名 用伪操作符PROC定义的名字成为过程名。过程的定义形式为:过程名PROC 类型过程名ENDS 过程名与标号类似,只是远、近过程名的类型是在过程的定义时由“类型”参数决定,类型为“FAR”时为远过程,类型为“NEAR”时为近过程。过程名的默认类型为近过程。远过程名是过程所处位置首地址的符号化地址,表示形式为:段地址:偏移地址 近过程名则是过程所处位置首地址的偏移地址的符号化偏移地址。退 出3.4.2
20、 3.4.2 常数常数 数值常数 汇编语言中的常数 字符串常数 属性常数 当前地址数 一、数值常数一、数值常数 数值常数分为整数常数和实数常数。1.整数常数 按其基数的不同,可以有二进制数B、八进制数Q、十进制数D、十六进制数H等几种不同的表示形式,汇编语言中采用不同的后缀加以区分。当一个数值数据后面没有后缀时,将默认为十进制数。退 出3.4.2 2.实数常数 实数常数在机内的表示有十进制和十六进制两种。1)十进制实数 它是一个带小数点的十进制数或带方幂的十进制数。例5.89,2.0,5.1E6,其中5.1E6=5.1106 2)十六进制实数 用R替换H作标记的十六进制实数,为实数在机内的表示
21、形式。它与十六进制数一样必须以数字作首字符。例如:42C88000R是IEEE格式编码的短实数100.25在机内的表示。0C1C90000R是IEEE格式编码的短实数-25.125在机内的表示。退 出3.4.2 二、字符串常数二、字符串常数 字符串常数是由单引号“”括起来的一串字符。例如:Assmbly Language and Programming23退 出3.4.2 三、属性常数三、属性常数 以上讲的名字的属性,都可以作为常数使用。1.段值 形式:SEG 标号或变量 2.偏移值 形式:OFFSET 标号或变量 3.变量类型值 形式:TYPE 变量 4.变量长度值 形式:LENGTH 变量
22、 5.字节总和值 形式:SIZE 变量退 出3.4.2 四、当前地址数四、当前地址数 汇编语言允许把某些语句所处内存地址取出使用。一种是$代表当前位置的偏移地址。一般有两种方式 另一种是THIS指示当前位置的地址及 其类型。形式:变量 THIS 类型。类型为“BYTE”时,表示所处位置是字节变量的地址。类型为“WORD”时,表示所处位置是字变量的地址。类型为“DWORD”时,表示所处位置是双字变量的地址。类型为“NEAR”时,表示所处位置是本段标号的地址。类型为“FAR”时,表示所处位置是远标号地址。退 出3.4.3 3.4.3 表达式表达式 表达式:由数据和运算符组成,汇编语句在表达式中允许
23、使用的数据有数字和标识符,并且限制表达式在整数范围内使用。汇编语言表达式运算法则同高级语言一样,即:首先计算高级优先级的运算符。相同优先级的运算符按从左到右的顺序计算。括号可以改变运算符的优先级,即应最先考虑括号中的运算符。汇编语言的表达式不能构成单独语句。算术运算符 运算符 逻辑运算符 关系运算符。退 出3.4.3一、算术运算符及移位运算符一、算术运算符及移位运算符 1.*,/,MOD,SHL,SHR 形式:数据1*数据2或数据1/数据2 *与/是一般乘除法。形式:数据1 MOD 数据2 其值为数据1/数据2的余数。形式:数据1 SHL 数据2 其值为数据1左移数据2位的值。形式:数据1 S
24、HR 数据2 其值为数据1右移数据2位的值。退 出3.4.3 2.+,-+,-为一般的加、减法。算术运算符应用于数字数据,结果也是数字。当算术运算符应用于存储器即地址数据时,其规则就更加严格:只有当结果有明确的、有意义的物理解释时,这些运算才有效的。二、关系运算符二、关系运算符 形式:数据1 EQ 数据2 判断数据1 等于 数据2?形式:数据1 NE 数据2 判断数据1 不等于 数据2?退 出3.4.3 形式:数据1 LT 数据2 判断数据1 小于 数据2?形式:数据1 LE 数据2 判断数据1 小于等于 数据2?形式:数据1 GT 数据2 判断数据1 大于 数据2?形式:数据1 GE 数据2
25、 判断数据1 大于等于 数据2?关系运算符的两个数据,或者都是 数字的,或 者是同一段的存储器地址。退 出3.4.3 三、逻辑运算符三、逻辑运算符 形式:NOT 数据 表示把数据取反。形式:数据1 AND 数据2 其值为数据1与数据2进行逻辑与运算。形式:数据1 OR 数据2 其值为数据1与数据2进行逻辑或运算。形式:数据1 XOR 数据2 其值为数据1与数据2进行逻辑异或运算。逻辑运算符的数据只能是数字的。退 出第五节第五节 说明性语句(说明性语句(2 2学时)学时)退 出 汇编语言的语句有两种基本类型,即执行性语句与说明性语句。执行性语句也就是CPU指令系统中的指令。说明性语句由伪操作符定
26、义,仅仅在汇编过程中告诉汇编程序应如何汇编。常用说明性语句共有5种类型。内存变量定义语句:语句用于描述数据和给数据赋值。包括简单内存变量和复合内存变量定义语句。3.5 调整偏移量语句:调整偏移量语句是在内存变量定义时用来调整内存变量起始偏移量的。符号定义语句:为常量或表达式定义一个符号名的语句。程序结构语句:程序结构语句用于说明源程序的结构和目标程序的结构。这些将在3.6.2.7节讲解。条件汇编语句:条件汇编语句用于说明汇编某部分语句时的条件,满足条件汇编,否则跳过这部分不予汇编。详细内容见3.8.2节。退 出3.5.1 内存变量定义语句内存变量定义语句 一、简单内存变量定义语句 1.字节变量
27、定义语句 形式:变量名 DB EXP,EXP EXP除字符串外每个数值占1个字节。EXP可以是整数表达式、字符串以及“?”。“?”在数据说明语句中表示不确定的值,即不赋初值。退 出3.5.1例如:bVarADB 101B,7,D,0FH,-1DB 2*56,INPUT PLEASE$,?DB 100 DUP(0)bVarBDB 1,2,3,4,5,6bVarCDB 1,2,3,4,5,6见内存分配图退 出3.5.1 2.2.字变量定义语句字变量定义语句 形式:变量名 DW EXP,EXP 它的数值为EXP,每个数值占2个字节。EXP可以是整数表达式、字符串以及“?”。注意,EXP若是字符串最多
28、只能为两个字符,不足两个字符采用右对齐,左补0。整数表达式可包括属性常数,若取偏移值,可省略标记“OFFSET”。例如:wVarADW011B,-32678,65535,0FH,2,5+7ACH,ABwVarBDWwVarA,DISPwVarCDW 1,2,3,4,5,6退 出3.5.1 3.3.双字变量定义语句双字变量定义语句 形式:变量名 DD EXP,EXP 它的数值为EXP,每个数值占4个字节。EXP可以是整数表达式、字符串以及“?”。表达式可包括属性常数,变量及标号在这里取段值与偏移值时不用标记,双字中低地址字存放偏移值,高地址字存放段值。字符串最多可写4个字符。例如:dVarADD
29、101B,2D89AH,5,5.0,3F800000R,20E30dVarBDDdVarA,wVarA退 出3.5.1 4.4.三字变量定义语句三字变量定义语句 形式:变量名 DF EXP,EXP 它的数值为EXP,每个数值占6个字节。EXP可以是常数表达式、字符串以及“?”。字符串最多可写6个字符。例如:fVarADF56DC2301AB00H,-1 5.5.四字变量定义语句四字变量定义语句 形式:变量名 DQ EXP,EXP 它的数值为EXP,每个数值占8个字节。EXP可以是常数表达式、字符串以及“?”。字符串最多可写8个字符。退 出3.5.1 例如:qVarADQ1,-1,1.2,1.0
30、,A 6.十字节变量定义语句 形式:变量名 DT EXP,EXP 它的数值为EXP,每个数值占10个字节。EXP可以是常数表达式、字符串以及“?”。字符串最多可写10个字符。实数在内存中一律为暂时实数形式。注意,在该语句中十进制整数的标记“D”通常不可省略。省略后表示BCD码数。例如:tVarA DT 1.0,567834,567834D,3FFF5600000000000000R退 出3.5.1 二、复合内存变量定义语句二、复合内存变量定义语句 1.重复子句 形式:重复次数DUP(EXP,EXP)其中重复次数取非零正整数,EXP可以是常数表达式、字符串以及“?”。例如:bArrayDB100
31、 DUP(?)dArrayDD4 DUP(160),90 DUP(A5)tArrayDT4.4,10 DUP(56)退 出3.5.1 2.2.结构类型结构类型 1)结构类型的定义 用STRUC和ENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下:结构名STRUC 变量定义序列 结构名ENDS 结构名代表整个结构类型,开始和结束两个结构名必须一致。结构内被定义的变量为结构字段,变量名即为字段名。退 出3.5.1 一个结构中允许含有任意多个字段,各字段的类型和所占字节数也都可任意。如果字段有字段名,则字段名必须唯一。每个字段可独立存取。例如:course S
32、TRUCdNoDD1cNameDBEnglishwScoreDW?course ENDS 上例中,course是结构名,它含有三个字段:dNo、cName和wSCORE,这些字段的类型分别是DD、DB和DW。结构course的字段分布如图3.4所示。退 出3.5.1 2)结构类型变量的定义 它的说明形式与前面介绍的简单数据类型的变量说明基本上一致。形式:变量名结构名 字段值表是给字段赋初值,中间用逗号,分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致;如果结构变量中某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留一对尖括号。退 出3.5
33、.1 例如:courseEnglish course ;使用缺省值courseAssember course courseMath course ;使用缺省的学号 3)结构类型字段的引用 定义了结构类型的变量后,若要访问其结 构中的某个字段,则可采用如下形式:结构变量名.字段名退 出3.5.1 下面二种方法都可以把结构变量courseMath中字段wScore的内容赋给寄存器AX,但如果在字段wScore之前增加或减少了字段,那么,偏移量的引用是需要改变,而字段名的引用是无需改变的。(1)用字段名引用MOV AX,courseMath.wScore(2)用字段的偏移量引用LEA BX,cour
34、seMathMOV AX,BX+11;其中11是wScore的偏移量退 出3.5.1 3.共用体类型 有时需要使几种不同类型的变量存放在同一段内存单元中。例如,可把一个字变量、一个字节变量、一个双字变量放在同一个地址开始的内存单元中,如图3.5所示。这种使几个不同的变量共占同一段内存的结构,称为“公用体”类型的结构。1)公用体类型的定义 共用体类型定义格式如下:公用体名UNION 变量定义序列 公用体名ENDS退 出3.5.1 共用体类型中的各字段相互覆盖,即同样的存储单元被多个不同的字段所对应,并且其每个字段的偏移量都为0。共用体类型所占的字节数是其所有字段所占字节数的最大值。例如:data
35、UNION wVarDW9876H bVarDB09H dVarDD 1234ABCDH dataENDS退 出3.5.1 2)公用体类型变量的定义 形式:变量名共用体名 注意:共用体数据类型的变量只能用第一个字段的数据类型来进行初始化。例如:dNum1datadNum2data;初始化错误 3)公用体类型字段的引用 定义了供用体类型的变量后,就可根据需要,以不同的字段名来存取该公用体类型中的数据。引用其字段的具体形式如下:公用体类型变量名.字段名退 出3.5.1 例如:MOVAX,dNum1.wVar MOVdNum1.bVar,BL 4.记录类型 汇编语言的记录类型与高级语言的记录类型不同
36、,它是为按二进制位存取数据提供方便的。1)记录类型的定义 记录类型定义格式如下:记录名RECORD字段名:宽度=EXP,字段名:宽度=EXP,退 出3.5.1 其中记录名及字段名是用户定义的名字,宽度取116之间的整数,它表示字段所占的二进制的位数,EXP是给相应字段赋初值,是个可选项。一个记录最长为机器字长。信息一律按照字段的先后顺序从信息区的高位向低位排列,右对齐,左补0。例如:recodeNameRECORDx:7,y:4,z:5 则记录各字段的分配形式为:XXXX XXXY YYYZ ZZZZrecodeName1RECORD a:2,b:3 则记录各字段的分配形式为:000AABBB
37、退 出3.5.1 2)记录变量的定义 形式:变量名记录名 字段值表是给字段赋初值,中间用逗号,分开,其字段值的排列顺序及大小应与该记录说明时各字段相一致。如果记录变量的某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留一对尖括号。例如:Name1recordName 退 出3.5.1 3)记录的专用操作符 操作符WIDTH和MASK是用于记录类型变量的两个属性操作符,犹如变量的OFFSET和SEG操作符的应用一样。(1)操作符WIDTH 操作符WIDTH返回记录或其字段的二进制位数,即其宽度。其一般书写格式如下:WIDTH 记录名或WIDTH 记录
38、字段名 假设有上面的记录recordName定义,则有下列属性结果:WIDTHrecordName=16 WIDTHX=7 WIDTHY=4 WIDTHZ=5退 出3.5.1(2)操作符MASK 操作符MASK返回一个8位或16位二进制数。在该二进制数中,被指定记录或字段的对应位的值为1,否则,其值为0。其一般书写格式如下:MASK记录名或MASK记录字段名 假设有上面的记录recordName定义,则有下列属性结果:MASK X=0FE00HMASK Y=01E0HMASK Z=001FH退 出3.5.1 4)记录字段的引用 其书写格式如下:记录字段名 字段名在使用中代表1个数值,此数值是把
39、该字段右移到信息区最右端的移位次数。假设有上面的记录recordName定义,则有下列属性结果:x=9 y=5 z=0退 出3.5.2 调整偏移量定义语句调整偏移量定义语句 常用的调整偏移量伪指令有:EVEN、ALIGN和ORG,它们的主要目的是:为了更有效地读取内存单元的内容。一、偶对齐定义语句一、偶对齐定义语句 形式:EVEN 功能:告诉汇编程序,本伪指令下面的内存变量从下一个偶地址单元开始分配。退 出3.5.2 二、对齐定义语句二、对齐定义语句 形式:ALIGN EXP 其中:EXP必须是2的幂,如2、4、8和16等。功能:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被EXP整除的
40、地址开始分配。例如:bVar1 DB 34H bVar1 DB 34H EVEN 等价 ALIGN 2 wVar2 DW 8795H wVar2 DW 8795H退 出3.5.2 三、调整偏移量语句 形式:ORGEXP 其中:EXP的取值范围065535。功能:告诉汇编程序,本语句下面的内存变量从该“EXP”所指定的偏移地址开始分配。例如,.COM文件的程序段中,程序代码必须从0100H偏移地址开始存放,所以程序的第一句需用ORG语句定义:ORG0100HMOVAX,dataMOVDS,AX退 出3.5.3符号定义语句符号定义语句 MASM中有三种等价语句:赋值等价语句,数值等价语句及串等价语
41、句。一、赋值等价语句一、赋值等价语句 形式:名字=EXP 其中,EXP可以是一个整数、常数表达式,地址 表达式,一个或两个字符。功能:汇编时该名字用表达式的值取代,类似与高级语言的符号数。允许重新定义。例如:lab=la-lb price=30 price=40退 出3.5.3 二、数值等价语句二、数值等价语句 形式:名字EQUEXP 功能:该语句与赋值等价语句功能一样,唯一的区别是:用EQU定义的名字不允许再定义。例如:labEQUla-lbpriceEQU30priceEQU40;错误的定义退 出3.5.3 三、串等价语句三、串等价语句 形式:名字EQU 功能:汇编时该名字用其字符串取代。
42、例如:bVarDB 12H,56HwPtEQU LEABX,bVarINCwPtBX退 出第六节第六节 微处理器的基本指令集微处理器的基本指令集(20学时)学时)指令系统确定了CPU所能完成的功能,是汇编语言进行程序设计的最基本部分。前面曾讲解过如下汇编语句:标号:/变量 指令操作符 操作数1,操作数2,操作数3 ;注释 操作数:操作数是指令或程序的主要处理对象。退 出3.6 机器中参加操作的数据存放位置有以下三种:参加操作的数据就包含在指令中。参加操作的数据在CPU的某个寄存器中。参加操作的数据在内存中,这时指令中的操作数包含着寻找参加操作的数据所在地址的信息。寻址方式:寻址方式就是寻找参加
43、操作的数据的偏移地址的方式。指令中如何表达操作数就是正确运用汇编指令的一个重要因素。退 出3.6.1寻址方式寻址方式 一、立即寻址方式一、立即寻址方式 这种寻址方式,就是上面所提到的第一种情况,参加操作的数据就包含在指令代码中。通常操作数写成“Im”,表示立即寻址方式,“Im”可以是汇编语言的常数。例如:MOV AL,06H ;功能:AL06H 指令代码:B0 06MOV BX,100 ;功能:BX0064H 指令代码:BB 6400 可以看出,指令中的源操作数部分的06H,100就包含在指令代码中,所以就是立即寻址方式,06H,100就是立即数Im。退 出3.6.1 二、寄存器寻址方式二、寄
44、存器寻址方式 这种寻址方式,就是上面所提到的第二种情况,参加操作的数据在CPU的某个寄存器中。通常操作数写成“R”,表示寄存器寻址方式。指令中可以引用的寄存器及其符号名称如下:8位寄存器:AH、AL、BH、BL、CH、CL、DH和DL,通常写成“R8”;16位寄存器:AX、BX、CX、DX、SI、DI、SP和BP,通常写成“R16”,用“R”代表8位与16位寄存器。段寄存器:CS、SS、DS和ES,通常写成“SegR”;退 出3.6.1 例如:MOVAL,06H;指令中的目标操作数AL就是寄存器寻址方式 MOVDS,AX;指令中的两个操作数DS和AX都是寄存器寻址方式 下面描述操作数的形式,均
45、表示参加操作的数据都在内存中,通常操作数写成“M”,表示内存的寻址方式,那么寻找存储参加操作数据的内存单元有效地址的方法有以下几种。三、直接寻址三、直接寻址 在指令中直接给出了参加操作数据的有效地址,这种寻址方式为直接寻址。退 出3.6.1 例如:MOV AX,2000H;功能:AX(DS:2000H)指令代码:A1 0020 MOV 2000H,AX;功能:DS:2000H(AX)指令代码:A3 0020 可以看出,有效地址2000H在指令代码中直接给出,所以就是直接寻址。而在汇编语言源程序中,由于汇编程序不支持数字化的直接地址,所以直接地址用内存变量来表示,所以上例可写成:退 出3.6.1
46、 ORG2000HwData DW1234HMOV AX,wData;功能:AX(DS:2000H)指令代码:A1 0020MOV wData,AX;功能:DS:2000H(AX)指令代码:A3 0020退 出3.6.1 四、寄存器间接寻址四、寄存器间接寻址 参加操作数据的有效地址用SI、DI、BX和BP这4个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。在不指定段的情况下,有下列规定:若有效地址用SI、DI和BX之一来指定,则其默认的段寄存器为DS;若有效地址用BP来指定,则其默认的段寄存器为SS。例如:MOV AL,SI 该指令是将DS段中的偏移量为SI的内存单元内容传给AL,如图
47、3.6所示。MOV AL,BP 该指令是将SS段中的偏移量为BP的内存单元内容传给AL,如图3.7所示。退 出3.6.1 五、相对寄存器寻址方式五、相对寄存器寻址方式 参加操作数据的有效地址是由SI、DI、BX和BP这4个寄存器之一的内容和指令中的8位或16位偏移量之和,段寄存器的默认情况同寄存器间接寻址。在程序中,8位或位或16位偏移量通常用内存变量来表示。位偏移量通常用内存变量来表示。例如:MOVAH,countSI;该指令的功能是将DS段中的偏移量为SI+count的内存单元内容传给AH,其执行过程如图3.8所示。退 出3.6.1 六、基址加变址寻址方式六、基址加变址寻址方式 参加操作数
48、据的有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。在不指定段的情况下,规定:如果有效地址中含有BP,则默认的段寄存器为SS;否则,默认的段寄存器为DS。例如:MOV AX,BPSI;该指令的功能是将SS段中的偏移量为(BP+SI)的内存单元内容传给AL,(BP+SI+1)的内存段元的内容传给AH,其执行过程如图3.9所示。退 出3.6.1 七、相对基址加变址寻址方式七、相对基址加变址寻址方式 参加操作数据的有效地址是一个基址寄存器(BX或BP)的值、一个变址寄存器(SI或DI)的值和指令中的8位或16位偏移量3项之和。例如:MOV BX,maskBXSI 该指
49、令的功能是将DS段中的偏移量为(BX+SI+mask)的内存单元内容传给BL,(BP+SI+mask+1)的内存单元的内容传给BH,其执行过程如图3.10所示。退 出3.6.2 指令系统指令系统 指令系统是CPU指令的集合,CPU除了具有运算功能的指令外,还有一些实现其它功能的指令。通常,把指令按其功能分成以下几类:数据传送指令 算术运算指令 逻辑运算指令 串指令 转移指令 处理器控制指令退 出3.6.2一、数据传送指令(一、数据传送指令(2 2学时)学时)1.MOV传送指令 形式:MOV 目标操作数,源操作数 功能:目标操作数(源操作数)该指令有如下9种形式:MOV R,R ;通用寄存器间传
50、送 MOV R,Imm;立即数送通用寄存器 MOV M,Imm;立即数送内存单元 MOV M,R ;通用寄存器送内存单元 MOV R,M ;内存数送通用寄存器 MOV SegR,R;通用寄存器送段寄存器(CS除外)退 出3.6.2 MOV R,SegR;段寄存器送通用寄存器 MOV SegR,M;内存数送段寄存器(CS除外)MOV M,SegR;段寄存器送内存单元 使用MOV指令应注意:源操作数和目的操作数不能同时为内存数,即MOV M,M的指令形式是非法的;两操作数的类型属性要一致,例如,MOV AX,BL是非法指令;操作数不能出现二义性,即至少一个操作数的类型要明确,例如,MOVBX,10