




已阅读5页,还剩159页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 8086/8088汇编语言程序设计 汇编语言程序设计是开发微机系统软件的基本 功,在程序设计中占有十分重要的地位。 由于汇编语言具有执行速度快和易于实现对硬件的控 制等独特的优点,所以至今它仍然是用户使用得较多的程 序设计语言。特别是在对于程序的空间和时间要求很高的 场合,以及需要直接控制设备的应用场合,汇编语言更是必 不可少了。 由于汇编语言本身的特点,本章将选择目前国内广泛使 用的IBM PC机作为基础机型,着重讨论8086/8088汇编语 言的基本语法规则和程序设计的基本方法,以掌握一般汇 编语言程序设计的初步技术。 4.1 程序设计语言概述 4.2 8086/8088汇编语言的基本语法 4.3 汇编语言程序设计基本方法 4.4 软件调试技术 目录目录 4.1 程序设计语言概述 程序设计语言是专门为计算机编程所配 置的语言。它们按照形式与功能的不同可分 为3种,即 : 机器语言 汇编语言 高级语言 目录 一、机器语言(Machine Language) 机器语言是由0、1二进制代码书写和存储的 指令与数据。 特点: 能为机器直接识别与执行;程序所占内 存空间较少。 缺点: 难认、难记、难编写、易出错。 二、汇编语言(Assembly Language) 汇编语言是用指令的助记符、符号地址、标号等 书写程序的语言,简称符号语言。 特点: 易读、易写、易记。 缺点: 不能像机器语言那样为计算机所直接识别,也 不如高级语言那样具有很好的通用性和可移植性 。 三、高级语言(High Level Language) 高级语言是脱离具体机器(即独立于机器),面向用户的 通用语言,不依赖于特定计算机的结构与指令系统。 用同一种高级语言编写的源程序,一般可以在不同计算 机上运行而获得同一结果。 由于高级语言的通用性特点,对于高级语言程序员来 说,不必熟悉计算机内部具体结构和机器指令,而只需要 把主要精力放在程序结构和算法描述上面。 所以,高级语言具有更广泛的领域。 汇编语言程序的上机与处理过程 图中,椭圆表示系统软件及其操作,方框表示磁盘文件 。椭圆中横线上部是系统软件的名称,横线下部是软件所 作的操作。 首先,用户编写汇编语言源文件;再经过汇编程序进 行汇编,产生属性为 OBJ的以二进制代码表示的目标程序 并存盘。 然后通过连接程序(LINK)把目标文件与库文件以及其 他目标文件连接在一起,形成可执行文件, 才能在DOS环境 下在机器上执行之。 4.2 8086/8088汇编语言的基本语法 各种机器的汇编语言其语法规则不尽相 同,但基本语法结构形式类似。 现以8086/8088汇编语言为例加以具体 讨论。 目录 一、8086/8088汇编源程序实例 在具体讨论8086/8088汇编语言的繁琐语法规则之前, 下面先举一个具有完整段定义格式的汇编源程序(即MASM 程序)实例, 以便对汇编语言的有关规定和格式有个初步 了解。 例:求从1开始连续50个奇数之和,并将结果存放在名 字为SUM的字存储单元中。 例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM 的字存储单元中。 DATASEGMENT;定义数据段,DATA为段名 SUMDW 0;由符号(叫变量名)SUM指定的内存 单元类型定义为一个字,初 值为0 DATAENDS;定义数据段结束 STACKSEGMENT STACK;定义堆栈段,这是组合类型伪指令, 它规 定在伪指令后须跟STACK类 型名 DB 200 DUP(0);定义堆栈段为200个字节的连续存 储区, 且每个字节的值为0 STACKENDS;定义堆栈段结束 CODESEGMENT;定义代码段 ASSUMEDS:DATA,SS:STACK,CS:CODE;由ASSUM伪指令定义各段寄存器 的内容 START: MOV AX,DATA ;将DS初始化为数据段首址 MOV DS,AX的段值DATA MOV CX,50 ;CX置入循环计 数值 MOV AX,0 ;清AX累加器 MOV BX,1 ;BX置常量1 NEXT: ADD AX,BX ;累加奇数和,计50次 INC BX ;求下一个奇数 INC BX DEC CX ;循环计 数器作减1计数 JNE NEXT ;未计完50次时,转至NEXT循环 MOV SUM,AX ;累加和送存SUM单元 MOV AH,4CH ;DOS功能调用语句,机器将结束本 INT 21H程序的运行,并返回DOS状态 CODEENDS ;代码段结束 END START ;整个程序汇编结 束 段 汇编源程序一般由若干段组成,每个段 都有一个名字(叫段名),以SEGMENT作为段 的开始,以ENDS作为段的结束,这两者(伪指 令)前面都要冠以相同的名字。 段可以从性质上分为代码段、堆栈段、数据段 和附加段4种,但代码段与堆栈段是不可少的,数据 段与附加段可根据需要设置。 在上面这个例子中,一共定义了3个段: 1个数据段 1个堆栈段 1个代码段 NOTE 每一行只有一条语句 且不能超过128个字符(从MASM 6.0开始可以是 512个字符) 但一条语句允许有后续行,最后均以回车作结束。 NOTE 整个源程序必须以END语句来结束,它通知汇编 程序停止汇编。END后面的标号START表示该程序 执行时的起始地址。 每一条汇编语句最多由4个字段组成,它们均按 照一定的规则分别写在一个语句的4个区域内 ,各 区域之间用空格或制表符(TAB键)隔开。 二、8086/8088汇编语言语句 (一)汇编语言语句的种类和格式 1 语句的种类 在8086/8088汇编语言中,有3种基本语句: 指令语句 伪指令语句 宏指令语句 指令语句 是一种执行性语句,它在汇编时,汇编程序将为之产生 一一对应的机器目标代码。 汇编指令 汇编指令机器码机器码 MOV DS,AX ADD AX,BX 8E D8 03 C3 伪指令语句 是一种说明性语句,它在汇编时只为汇编程序 提供进行汇编所需要的有关信息,如定义符号, 分配存储单元,初始化存储器等,而本身并不代 表生成目标代码 DATA SEGMENT AA DW 20H,-30H DATA ENDS 内存位置: FF 20 00 D0 宏指令 是以某个宏名字定义的一段指令序列, 在汇编时,凡有宏指令出现的地方都将用相 应的指令序列的目标代码插入。 宏指令语句是一般性指令语句的扩展 2 语句格式 8086/8088的汇编语句一般由4个字段组成 如下: (1)指令语句的格式 标号:前缀指令助记符操作数表;注释其 中,表示可以任选的部分;操作数表是由逗号分隔开的 多个操作数。 1)标号 标号代表“:”后面的指令所在的存储地址(这 里是逻辑地址),供JMP、CALL和LOOP等指令作操作数使用 ,以寻找转移目标地址。除此之外,它还具有一些其他“属 性”。 2)前缀 8086/8088中有些特殊指令,它们常作为前缀同其 他指令配合使用,例如和“串操作指令”(MOVS、CMPS、 SCAS、LODS与STOS)连用的5条“重复指令”(REP、 REPE/REPZ、REPNE/REPNZ), 以及总线封锁指令LOOK等,都 是前缀。 3)指令助记符 包括8086/8088的指令助记符,以及用宏定义语句定 义过的宏指令名。 4)操作数表 对8086/8088的一般性执行指令来说,操作数表可以 是一个或两个操作数,若是两个操作数, 则称左边的操作 数为目标操作数,右边的操作数为源操作数;对宏指令来 说,可能有多个操作数。操作数之间用逗号分隔。 5)注释 以“;”开始,用来简要说明该指令在程序中的作用 (不是重复解释指令本身的功能),以提高程序的可读性 。 (2)伪指令语句的格式 名字伪指令参数表;注释 其中,“名字”可以是标识符定义的常量名、变量名、过 程名、段名以及宏名等。所谓标识符是由字母开头,由字 母、数字、特殊字符(如?、下划线、等)组成的字符串 。 默认情况下,汇编程序是不区分大、小写字母的。 注意,名字的后面没有冒号,这是伪指令语句同指令语句 在格式上的主要区别。 MASM 中伪操作命令 在伪指令语句的参数表中,包含有用逗号分隔的多个参数,它们 可以是常数、变量名、表达式等。 例:SUMDB12H,23H,34H,45H,56H,67H,78H,89H (二)指令语句的各个部分: 指令语句主要由8086/8088指令系统 中的指令组成, 一条指令必须包括一个 指令助记符,以及充分的寻址信息,以使 汇编程序能将其转换成一条机器指令的 操作码字段及由操作数寻址方式指定的 操作数字段。 1 标号(Label) (1)标号及其属性 标号是为一组机器指令所起的名字,用来作为汇编语 言源程序中转移、调用以及循环等指令 的操作数程 序转移的转向地址(目标地址)。标号表示指令地址,是指 令的符号地址,它具有3种属性段地址、段内偏移量( 或相对地址)以及类型。 1)段地址(Segment Base) 标号所在段的段地址(16位数),是标号所在段的20位 起始地址的前16位。 2)段内偏移量(Offset) 它是标号与段起始地址之间相距的字节数,为一16位 无符号数。 3)类型(Type) 类型表示该标号所代表的指令的转移范围,分 (近)与(远)两种。类型的标号仅在 同一段内使用,用字节指针给出转移的偏移量属性(即 只改变IP值,不改变CS值);而类型的标号无此限 制,必须用字节指针指出转移的段地址与段内偏移量。 当标号用作或等指令的目标操作数时,若 为段内转移或调用则采用类型;若为段间转移或 调用则应当采用类型。 JMP FAR PTR LINE ()标号的定义 )标号的组成 标号用一标识符定义,即以字母开头,由字母、数 字、特殊字符(如? 、下划线、等)组成的字符串表 示。标号的最大长度一般不超过个字符,除宏指令 名外,标号不能与保留字相同。保留字看上去类似标识 符,但它们在语言中有被机 器赋于的特殊意义。 寄存器名; 指令系统的全部指令助记 符; 汇编语言的伪指令; 其他名字 标号最好用具有一定含义的英文单词或单词缩写 表示,以便于阅读。 )在指令的助记符之前,使用标号并紧跟一个冒号“:” , 表示该标号被定义为一个类型为的标号。 当然,标号也可单列一行 例如: subrout: mov ax,3000h )标号的使用,通常“标号”只在循环、转移和调用指令 中 使用。 例如: JMP SHORT SUBOUT 1字节立即数 JMP SUBOUT 2字节立即数 JMP FAR PTR SUBOUT 4字节立即数 表4.1 指令助记符 (Instruction Mnemonics) 执行性指令中的指令助记符主要为 指令系统中指令助记符。 操作数 (Operand) 操作数的汇编语言表示法及规则比较复杂,这是因为 操作数的表示既要能充分体现出汇编语言中使用符号操作 数和指令助记符的优越性,使程序员能尽可能地减少在存 储分配和地址计算方面的工作,又要能被汇编程序有效地 翻译成对应的特定处理器所具有的各种寻址方式。 ()立即操作数 立即操作数在指令中直接给出,不需要使用寄 存器,也不涉及访问数据区的操作,只能作为源 操作数。立即操作数是整数,可以是字节或 字节。在汇编语言中,立即操作数用常量(包括 数值常量和符号常量)以及由常量与有关运算符 组成的数值表达式表示。 如:MOV BX,1000+5*3 ()寄存器操作数 通用寄存器、 、以及段寄存器、 、都可以作为操作数。如:MOV BX,AX ()存储器操作数 以指定的存储单元中的内容作为指令的处理对 象,汇编指令中的存储器操作数实际上是存储单元 的逻辑地址。 例 4.3 MOV WORD PTR 0A00H,12ABH 例 4.4 MOV AX,BX 例 4.5 DEC BYTE PTR BP+12H 例 4.6 DEC WORD PTR SI+66 例 4.7 DEC WORD PTR BX+DI+50 存储器操作数的段超越: INC BYTE PTRBX+20H 与 INC BYTE PTRBP+20H INC BYTE PTR ES:BX+20H 与 INC BYTE PTR DS:BP+20H INC BYTE PTR DATA:BP+20H 各种寻址方式下操作数的表达式 ()常量与数值表达式 )常量是指那些在汇编过程中已经有确定数值的量,它 主要用作指令语句中的立即操作数 、变址寻址和基址加 变址寻址中的(位移量)或在伪指令语句中用于 给变量赋初值。 )常量分“数值常量”(也称字面常数)与“符号常量 ”两种。 数值常量:以各种进位制数值形式表示,以后缀字符 区分各种进位制,后缀字符表示十六进制,或表示 八进制,表示二进制,表示十进制,十进制常省略后 缀。 符号常量:预先给常量定义一个“名字”,然后在汇 编语句中用该“名字”表示该常量。采用符号常量的优点 是改善程序的可读性;如果将符号常量作为程序的参数, 则 可方便地实现参数的修改,增强程序的通用性。其定 义需用伪操作命令(伪指令)“”或“”。 例: * , 即把送。 常量是没有属性的纯数据,其值是在汇编时确定的。 )各种形式的常量格式 4)数值表达式 一个能被计算并产生数值的表达式称为数 值表达式(Constant Expression)。一个数 值表达式可由常量、字符常量以及代表常量或 串常量的名字等以算术、逻辑和关系运算符( Operator)连接而成。 1.算数运算符:+,-,*,/,MOD,SHR,SHL MOV AL,18MOD7 ;AL中为余数 MOV BL,00111111B MOV AL,BLSHR3 ;00000111B 2.逻辑运算符:AND,OR,XOR,NOT MOV AX,3456HAND1234H 3.关系运算符:EQ,NE,LT,GT,LE,GE 条件真,结果为:0FFFFH;否则为0000H。 MOV BX,PORT LT 5 ;当PORT小于5, BX=FFFFH,否则BX=0000H。 例4.12: AND AX, (NUMB LT 5)AND 30) OR (NUMB GE 5) AND 20) 当时,指令含意为 , ; 当时,指令含意为 , 。 此例中,操作符与操作数表达式中的 具有不同的含意,前者是助记符,后者是伪 运算。 ()变量与地址表达式 )变量及其属性 汇编语言中,“变量”( )是内存中的一个数据区的名字,即数据所 存放地址的符号地址,它可以作为指令中的存 储器操作数来引用。由于存储器是分段使用的 ,因而对源程序中所定义的变量有多种属性。 变量的三种属性: 段属性: 代表该变量对应数据区所在段的段地址。 偏移值属性: 代表该变量与段起始地址的距离。 类型属性: 代表存取单位,到底是字节还是字 或者是双字等。 )变量的定义 变量一般都是在数据段或附加段中使用伪指令(即 伪操作命令)、和 来进行定 义的,这些伪指令称为数据区定义伪指令,其格式为: 变量名 数据区定义伪指令 表达式 例:DATA SEGMENT SUMDB 12H,23H,34H,45H COUNTDW 22H,33H,44AEH,55H DATA1DD 9876H,ABCDH DATAENDS 在内存的位置: DATA段: 34 45 22 00 33 00 AE 44 55 00 76 98 00 00 CD AB 00 00 23 12SUM COUNT DATA1 MOV AX,COUNT AX=0022 MOV BX,SUM 错 数据区大小及初值确定: A. 数字表达式: DATA1 DB 3*5+2 B. ASCII字符串(DB) STRING DB HELLOW 48H,45H,4CH,4CH,4FH,57H C.地址表达式:(DW,DD) ADDR DW 1234H,3456H,4567H DISP DW ADDR ;取ADDR在数据段的偏移量 DISP1 DD ADDR ;取偏移量和段地址 D. ? 无确定初值 ADDR DW ? E. DUP 重复因子 DATA2 DB 20 DUP(?) DATA3 DW 2 DUP(11),3 DUP(22) 注意:地址位置及属性 MOVAX,DATA3+2 MOVAL,DATA3+2 错 MOVAL,BYTE PTRDATA3+2 )变量的使用 变量是存储器数据区的符号表示,因此指令中的存储 器操作数可以用变量形式给出。 程序中必须明确该指令是字节操作还是字操作: a、指令中至少一个操作数能说明是字节还是字 操作。 例如:MOV AX,BX MOV AL,BX 目的操作数说明了操作类型。 b、当使用变量进行存储器寻址时,变量的类型 必须与指令的要求相符。 例如: DATA2 DB 20 DUP(2A) DATA3 DW 2 DUP(11),3 DUP(22) MOVAX,DATA3+2 MOVAL,DATA3+2 错 MOV BX,DATA2 错 c、若要在该存储器数据段进行操作,可用类型运算 符PTR明确指出变量的类型。 MOVAL,BYTE PTRDATA3+2 d、变量仅对应数据区的第一个数据,当对其他数据项 进行操作时,必须使用地址表达式指出该数据项。 例如: DATA DB 12,23,45 COUNT DW 1234H,0AB55H,45FEH MOV AL,DATA ;AL=12 MOV BL,DATA+1 ;错 MOV BL,DATA+1 MOV CX,COUNT ;CX=1234H MOV SI,COUNT+2 ;SI=0AB55H e、可以用PRT属性运算符改变存储器数据区的类型: 例如: DATA-W DW 10DUP(0EEH) 说明DATA-W段的数据属性为字; 用PTR及EQU伪指令建立一个与DATA-W同一数 据段而类型不同的变量方法如下: DATA-B1 EQU BYTE PTR DATA-W DATA-D EQU DWORD PTR DATA-W DATA-B2 EQU BYTE PTR DATA-W+1 DATA-B1为20个字节的数据组 DATA-D为5个双字的数据组 DATA-B2为19个字节的数据组 NOTE 使用变量作为存储器操作数时要注意几个问题。 必须在程序中明确一条指令是完成位数据操作还是 1位数据操作。 变量作为指令中的存储器操作数使用时,其段属性(段 基址)与该指令使用的缺省段寄存器内容必须相符,若 不相符则必须使用“跨段前缀”(或称段超越),否则 指令无法从存储器中取得正确的操作数进行操作。 )地址表达式 汇编语言中表达式有两类 数值表达式:在汇编时产生一数值,仅具有大小而无 其他属性,可作为执行性指令中的立即操作数和数据区中 的初值使用。 地址表达式:它表示存储器地址,其值一般都是段内 的偏移地址,因此它具有段属性、偏移值属性、类型属性 。地址表达式主要用来表示执行性指令中的多种形式的操 作数。 地址表达式由变量、标号、常量、寄存器, ,的内容(用寄存器名以及方括号表示)以及一些 运算符组成。 地址表达式中可以使用的运算符及使用规则: 、数字表达式的三种运算符: 变量或标号可以加上或减去某个结果为整数的数值表 达式,其结果仍为变量或标号,类型及段地址属性不变, 仅修改偏移值属性。 由于数值表达式可以出现在地址表达式中,因此,一 切数值表达式的运算符都可在地址表达式中出现。同一段 内的两个变量或标号可以相减,但结果不是地址,而是一 个数值,表示两者间相距的字节数。 MOV AX,1000+50*4 、方括号及寄存器BX,BP,SI,DI 如这几个寄存器不用方括号括起来,表示寄存器本身 或操作数。 例: , 表示将中的内容送中 如这几个寄存器用方括号括起来,则表示地址表达式。 例: , 表示将所指的存储单元 中的字数据送中 c 、运算符 是类型运算符,它用来说明某个变量、标号或 地址表达式的类型属性,或者使它们临时兼有与原定义所 不同的类型属性,但保持它们原来的段属性和偏移地址属 性不变。格式为:数据类型 PTR 地址表达式 根据地址表达式的不同值,数据类型可以是BYTE、 WORD、DWORD、NEAR、FAR等。 例:ADD BYTE PTRDI,23H PRT指定地址表达式DI 的类型为字节,此句表示将23H与内存字节单元DI中 的字节数据相加,结果送回内存字节单元DI。 d、段超越运算符 段超越运算符用来临时给变量、标号或地址表 达式指定一个段属性。 段超越运算符格式: 段名:地址表达式 或 段寄存器名:地址表达式 例:INC BYTE PTR ES:BP+3 ES:为跨段前缀,冒号“:”前的ES段寄存器指明了操 作数当前所在的段为附加数据段。 这时,操作数的物理地址将由ES中的内容左移4位与偏 移地址BP+3相加而求得。 此句表示将附加数据段中偏移地址为BP+3的内存 单元中的数据加1后仍保留在该单元中。 跨段时, 物理地址的计算是由系统自动完成的。 如果没有跨段前缀“ES:”,那么,由BP+3地址表 达式所表示的偏移地址将被系统默认为是在堆栈段中。 (3)运算符综述 IBM宏汇编中有5种运算符,即: l算术运算符(Arithmetic operators) l逻辑运算符(Logical operators) l关系运算符(Relational operators) l分析运算符(Analytic operators) l合成运算符(Synthetic operators) 前面3种运算符已经介绍了,下面对后2种运算符作一 简单介绍。 1)分析运算符 分析运算符用来把存储器操作数(变量或标号)分解为 它的组成部分(段地址、偏移值、类型 、数据字节总数、 数据项总数等),并以数值形式回送给存储器操作数(变量 或标号)。 A.SEG取段地址 MOVBX,SEG DATA1 B.OFFSET取偏移值 MOVAX,OFFSET DATA1 C. TYPE取类型值 DB:1,DW:2,DD:4,DQ:8,DT:10,NEAR:-1,FAR:-2 MOV AX,TYPE DATA1 D. SIZE取数据区字节总数 MOVAX,SIZE DATA1 E. LENGTH取数据区数据项数(DUP),如 未用DUP,结果是1。 MOVAX,LENGTH DATA1 SIZE=LENGTHTYPE F. HIGH取高8位 G. LOW取低8位 例 COUNT EQU 0ABCDH MOV AH,HIGH COUNT;AH=AB MOV AL,LOW COUNT;AL=CD 例如: DATA1 DW ? DATA2 DB 45,29H ARRAY DW 100DUP(22) 则: MOV BX,SEG DATA1;取L2的段基址 MOV BX,OFFSET DATA2;取L2的偏移量 MOV AX,TYPE DATA1;AX=2 MOV AX,TYPE DATA2;AX=1 MOV CX,LENGTH DATA1;CX=1 MOV CX,LENGTH DATA2;CX=1 MOV CX,LENGTH ARRAY;CX=100 MOV CX,SIZE DATA1; CX=2 MOV CX,SIZE ARRAY;CX=200 2)合成运算符 合成运算符用来把存储器操作数的属性部分建 立一个新的存储器地址操作数 A.PTR: 例:DATA2 DW 12,34 DATA1 EQU BYTE PTR DATA2 B.THIS:格式:THIS 例:DATA1 EQU THIS BYTE DATA2 DW 1234 C.SHORT: 例如: 指定某个标号为短标号。 3) 3) 运算符的优先级运算符的优先级 (三)伪指令语句 伪指令语句又称为说明性指令或指示语句。 高级语言程序中的可执行语句被翻译成机器语言时, 必须有非执行语句用于实现赋值、保留存储器,给常数 分配符号名字、形成数据结构和终止编译等。 当汇编语言被翻译成机器语言时,也必须包括有执 行类似任务的伪指令。同时,由于 还依靠段寄存器工作,所以,还必须包括有一些在汇编 过程中能告诉汇编程序把某个段分配给哪一个段寄存器 的伪指令。 伪指令语句的格式为: 名字 伪指令助记符 参数表 ;注释 名字是一标识符,一般不能有“:”结尾,名 字可以是符号常量名、段名、变量名等,由不同 的伪指令决定。参数表是用“,”分隔开的一系 列参数(包括操作数)。 、5种数据定义伪命令 )(定义字节) 用于申请一个数据项为字节的数据区,需要时可以用 数值表达式赋予初值。如果该数据区定义作为一个变量, 则变量类型是。 )(定义字) 数据项为字,允许用地址表达式为数据项赋初值(即 偏移量属性),变量类型是。 )(定义双字) 数据项为双字,允许用地址表达式为数据项赋初值 (即段属性及偏移量属性),变量类型为。 )(定义4字) 数据项为4字,变量类型为BYTE。 )(定义10字节) 数据项为10个字节,变量类型为。 *:在存储器中的排列顺序:低字节在前 ,高字节在后。 这段程序用DB、DW和DD定义了若干变量,根据上述对数 据定义命令的约定,则各变量及其属性可列于表4.5中: 所有变量的段属性(分量)均为。、 、右边的表达式或数值即相应存储单元中的内容,汇编 后的存储器分配情况如图4.3所示。 数据定义的作用存储器初始化 、可用于初始化存储器。这些伪指令 的右边有一表达式,表达式之值即该存储“单位”的初值 。一个存储单位可以是字节、字、双字。 表达式有数值表达式与地址表达式之分,在使用地址 表达式来初始化存储器时,这样的表达式只可在或 伪操作命令中出现,绝不允许出现在中。“变 量” 语句表示利用该变量的偏移量来初始化相应的存储 字;“变量”语句表示利用该变量的段分量和偏移量 来初始化相应的两个连续的存储字,低位字中是偏移量, 高位字中是段分量。 ;内容为 ;内容为 ;即高位字为,低位字为 ;内容为 ;内容为 * ;内容为 )从单元开始分配)从单元开始分配 个存储单元。个存储单元。 )为 )为 个字节存储单元设置初值。个字节存储单元设置初值。 汇编后将变量的偏移量汇编后将变量的偏移量 存入其前存入其前2 2个字节内存单元个字节内存单元 ; 而将段的段地址而将段的段地址 存入其后存入其后2 2个字节内存单元中。个字节内存单元中。 伪指令中的伪指令中的2 2个字节即表示变个字节即表示变 量的偏移地址及段地址。量的偏移地址及段地址。 一个字节的操作数也可以是某个字一个字节的操作数也可以是某个字 符的代码,注意只允许符的代码,注意只允许 在伪操作命令中用字符串来初在伪操作命令中用字符串来初 始化存储器。始化存储器。 例4.26 HELLO AB W AB 、符号定义伪指令 汇编语言中所有的变量名、标号名、过程 名、指令助记符、寄存器名等统称“符号”,这 些符号可以通过伪指令重新命名,也可以通过伪 指令为其定义其他名字及新的类型属性。 (1)EQU: )为常量定义一个符号,以便在程序中使用符号来表示常 量。 格式: 符号常量名 数值表达式 例如:SUM EQU 20H MOV AL,SUM ;(AL)=20H )给变量或标号定义新的类型属性并起一个新的名字。 格式: 变量名或标号名 类型 变量或 标号 例如:DATA EQU THIS WORD DATA1 DB ABCDEFG )可以给由地址表达式指出的任意存储单元定义一个名字 。 格式: 符号名 地址表达式 符号名可以是“变量”或“标号”,取决于地址表达式的 类型。 例如:ADR EQU ES:BX+SI+5 MOV AL,ADR ;将BX+SI+5单元内容送到AL )用来为汇编语言中的任何符号定义一个新的名字。 格式: 新的名字 原符号名 例如:CBCD EQU AAM )使用伪操作命令时,左端的符号名不能是 程序已定义过的符号名。 ()(等号伪指令) 它与基本类似,起赋值作用 )使用“”定义的符号名可以被重新定义,使符号名具 有新值。 例: ;先将12赋于符号名X ;将符号名X重新定义使其具有新值 则在第2个语句经过汇编后,最终。 )习惯上“”主要用来定义符号常量。 ()(类型定义伪指令) 伪指令为当前存储单元定义一个指定类型 的变量或标号。其格式为: 变量名或标号名 类型 对于数据项,类型可以是、 ;对于可执行的指令代码,类型 为和 。 伪指令不仅给名字(标号或变量)定义一 个类型属性,而且隐含有给名字定义段属性和段内偏移量 属性。 例如:AREAW LABEL WORD AREAB DB 100 DUP(23) MOV AREAW,AX MOV AREAB49,AL 、段定义伪指令 段定义伪指令指示汇编程序应如何按段来组织 程序和使用存储器。所用命令主要有 ,等。 ()和伪指令 和伪指令用来把程序 模块中的指令或语句分成若干逻辑段,其格式如 下: 段名 定位类型组合类型 类别 ;一系列汇编指令 段名 格式中与必须成对出现, 与之间为段体,给其赋于一个名字 ,名字由用户指定,是不可省略的,而定位类型、组合类 型和类别是可选的。 例如:DATA SEGMENT AAA DB 20 DUP(?) BBB DW 10 DUP(?) DATA ENDS )定位类型 又称“定位方式”,表示该段对起始边界地址的要求 ,有4种定位类型: 起始地址 即字节型; 起始地址 即字型; 起始地址 即节型; 起始地址 即页型。 其中为隐含值,即如果省略“定位类型”, 则汇编程序按处理。 )组合类型 组合类型又称“联合方式”或“连接类型”。它指 示连接程序,如何将某段与其他段组合起来的关系。连 接程序不但可以将不同模块的同名段进行组合,并根据 组合类型,可将各段顺序地连接在一起或重叠在一起。 共有6种组合类型: A.不组合:缺省,汇编将不同的逻辑段分别在装入。 B.PUBLIC:将相同名字的逻辑段集中成一个段装入。 C.STACK:同PUBLIC,仅限堆栈段用。 D.COMMON:对于相同名字的逻辑段,从同一个地址开始 装入,导致逻辑段重叠,连接后的段长为原最 长逻辑段,内容是最后逻辑段内容。 E.MEMORY:本逻辑段放在所有段的最后,若出现多个 MEMORY段,其余作COMMON段处理。 F.AT:表示该段定位段地址。 )类别 类别是用单引号括起来的字符串,以表示该段的类别 ,连接程序只使同类别的段发生关联,连接时用于组成段 组的名字。典型的类别如、 、等,也允许用户在类别中用其他的表示。 例如: (2) ASSUME 伪指令 ASSUME是段定义伪指令,它一般出现在代码段中,用 来告诉汇编程序哪一个段寄存器是其对应段的段地址寄存 器。当在程序中使用这条语句后,汇编程序就能将被设定 的段作为当前可访问的段来处理。它也可以用来取消某段 寄存器与其原来设定段之间的对应关系(使用NOTHING即可 )。引用该伪指令后,汇编程序才能对使用变量或标号的 指令汇编出正确的目标代码。 其格式为: ASSUME 段寄存器:段名,段寄存器名:段名 其中“段名”可以是程序中已定义过的任何段名或组 名,也可以是表达式“SEG变量”或“SEG标号”,或者是 关键字NOTHING。 例4.34:ASSUME CS:SEGA,DS:SEGB,SS: NOTHING 其中:SEGA是代码段 SEGB是数据段 NOTHING表示SS所作的设定已取消。 CS的段地址由系统决定; DS的段地址由编程直接装入。 ()伪指令 伪指令用来指出其后的程序段或数据块 存放的起始地址的偏移量。 其格式为: 表达式 汇编程序把语句中表达式之值作为起始地址, 连续存放程序和数据,直到出现一个新的 指令。若省略,则从本段起始地址开始连 续存放。 例如: DATA SEGMENT ORG 6 A DW 1234H ORG $+4 B DW 5678H DATA ENDS 34 12 78 56 DATA,1000H 0006H+1000H 000CH+1000H 、过程定义伪指令 过程分为两类: 外部过程:当调用该过程的主程序与该过程不在一个 源程序文件中时,该过程应定义成外部过程。这时在主程 序文件中应说明该过程(设过程名为)为外部 过程: : 在定义该过程的程序文件中应说明该过程可被其他程 序文件调用: 内部过程:当调用该过程的主程序与该过程在同一个 源程序文件中时,该过程叫做内部过程。 (2)过程定义伪指令格式: 过程名 类型 ;指令序列 过程名 类型可选作或。选时,该过 程一定要与主程序在一个段;选时,该子程序可以 与主程序在同一个段,也可与主程序不在同一个段。如果 类型省略,则系统取类型。 例如: NAME1 PROC FAR CALL NAME2 RET NAME2 PROC NAME2 ENDP NAME1 ENDP (3)调用过程 调用过程用“过程名”来实现。 其中过程名是个标识符,可作为调用此过程的指令 中的操作数。过程可以“嵌套”使用,即过程中又可以 调用别的过程;过程还可以“递归”使用,即过程中又 可以调用过程本身。调用指令的使用要和过程的属性一 致,尤其是一个过程已定义为的话,那末即使当 前调用指令和此过程有同一代码段,也必须使用段间调 用指令,否则将会出错。 IP及CS的入栈 (4)过程返回 RET n IP及CS的出栈 例4.36:SEGX SEGMENT CALL FAR PTR SUBT SUBT PROC FAR RET SUBT ENDP SEGX ENDS SEGY SEGMENT CALL FAR PTR SUBT SEGY ENDS 4.3 汇编语言程序设计基本方法 与高级语言编程相似,编写汇编语言源程序也应当首 先理解和分析题意与要求,选择适当的数据结构和算法, 然后,再着手用汇编语言来实现。 有关8086/8088汇编源程序的结构及语法规则,我们在 前面已有详述。从中可以看到,在环境下的 汇编语言程序结束时,通常用的 号中断调用,以便使程序控制返回。 MOV AH,4CH INT 21H 目录 一、顺序结构程序 例:对两个字节无符号数求和,这两个数分别用 变量及表示。将两数之和的最高位进位 放在中,两数之和的其他位按从高到低顺序 依次放在,中。 程序如下: D SEGMENT D1 DB 12H,34H,56H,78H,9AH,0ABH,0BCH,0CDH D2 DB 0CDH,0BCH,0ABH,9AH,78H,56H,34H,12H D ENDS C SEGMENT ASSUME CS:C,DS:D ;说明代码段、数据段 BG: MOV AX,D MOV DS,AX ;给DS赋段值 LEA DI,D1 ;将D1表示的偏移地址送DI MOV DX,DI ;取第1操作数到寄存器中 MOV CX,DI+2 MOV BX,DI+4 MOV SI,DI+6 LEA DI,D2 ;将D2表示的偏移地址送DI ADD DX,DI ADC CX,DI+2 ADC BX,DI+4 ADC SI, DI+6 MOV AL,0 ADC AL,0 MOV AH,4CH INT 21H C ENDS END BG 二、分支结构程序 例:比较以存储器变量和表示的两个有符号 字数据的大小,将其中较大数据放在寄存器中 程序如下: DATA SEGMENT D1 DW -123H ;补码为FF85H D2 DW -120H ;补码为FF88H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ;说明代码段、数 据段 BEGIN: MOV AX,DATA MOV DS,AX ;给DS赋段值 MOV BX,D1 CMP BX,D2 JGE NEXT ;若D1D2,则不 换 ,转NEXT MOV BX,D2 ;若D1DEBUG d:pathfilename.exeparm1parm2回车 说明:“C”为DOS下的提示符; d: :表示DEBUG.EXE程序所在的盘符; path:filename的目录路径(一般可在系统Autoexec.bat文 件中将路径设置好,这样就不必在每次进入DEBUG时都输 入盘符及路径); filename:要分析或调试的二进制程序文件名; exe:程序文件的扩展名; parm1:被调试程序约定的第1参数文件名; parm2:被调试程序约定的第2参数文件名。 功能: 该命令是在DOS下把DEBUG.EXE程序调入内存, 并运行DEBUG程序。 输入命令后,屏幕上将出现提示符“-”,表 示当前已进入DEBUG的命令状态,可执行DEBUG程 序的命令。 下面介绍一些常用的DEBUG命令。 (一)显示存储单元内容: 格式:起始地址 格式:地址范围 功能:格式命令是从起始地址开始按十六进制显示 个单元的内容,每行个单元。每行右侧还显示该 个单元的码字符,对于无字符对应的ASCII 码 则显示“.”。格式命令是显示指定范围存储单元中的 内容,每行个单元。每行右侧还显示该个单元的 码字符,无字符对应的则显示 “.”。如果不给出起始地址或地址范围,则从当前地址 开始按格式操作。 例:显示16B7:100H至11FH内存块的内容。 (一)D 16B7:100 L20 16B7:0100 B4 4C CD 21 07 B8 00 48-8C C1 FA 8E D1 BC 80 08 .L.!.K 16B7:0110 FB 2E FF 2E 20 D4 20 73-74 61 72 74 34 00 A6 16 , start4. (二)修改存储单元内容 格式:起始地址 列表 格式:地址 功能: 格式是按列表内容(包括字符或数值串)修 改从起始地址开始的多个存储单元内容。 (三)显示、修改寄存器内容 格式:寄存器名 功能:如果指定了寄存器名,则显示寄存器的内容,并允 许修改。如果不指出寄存器名,则按如下格式显示CPU内 部各寄存器(包括通用寄存器、段寄存器、标志寄存器) 的内容: AX=XXXX BX=XXXX CX=XXXX DX=XXXX SP=XXXX BP=XXXX SI=XXXX DI=XXXX DS=XXXX ES=XXXX SS=XXXX CS=XXXX IP=XXXX NV UP DI PL NZ NA PO NC XXXX:XXXX C70604023801 MOV WORD PTR 0204,0138 DS:0204=0000 以上各通用寄存器显示了其中的内容,均以4位十六 进制数的形式来显示;标志寄存器中各标志位(除TF外) 的值均以符号形式显示;CS:IP所指向的内存内容反汇编 成一条指令,可视为将要执行的指令。 (四)运行命令 格式: 起始地址第1断点地址第2断点地址 功能:从指定起始地址开始执行,依次在第1、第2 等断点处中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年消防员现场救援安全操作协议
- 2025年科研项目协议范例
- 2025年标准创业孵化场地租赁协议
- 2025年正规门面出租策划协议范本
- 大型地下空间施工技术与管理方法
- 施工过程中的质量管理与控制体系
- 重塑跨境电商出海新势能的现状及总体形势
- 智能教育环境下的语文教学改革探索
- 清明节主题模板222
- 资源共享与教育服务质量提升的双重驱动
- 肠外营养静脉输注途径的规范应用
- 2021年新高考全国1卷(含答案解析)
- 自动泊车辅助系统课件
- 小学综合实践活动-《认识二十四节气》教学课件设计
- 神经外科疾病诊疗规范诊疗指南诊疗常规2022版
- 廉政风险防范管理办法
- 上海市长宁区西延安中学2022-2023学年八年级数学第二学期期末检测试题含解析
- 2023年衢州中考科学卷真题含答案
- 施工方案设计(宿舍楼装修改造)
- 全国初中语文优质课一等奖《壶口瀑布》展示课精品课件
- 园林工程园林给水排水工程
评论
0/150
提交评论