汇编语言——第3章宏汇编语言

  • 格式:docx
  • 大小:171.79 KB
  • 文档页数:24

第三章 宏汇编语言

一:宏汇编语言格式

3.1.1 指令语句格式

指令语句的一般格式如下:

[标号:] 指令助记符 操作数 ;注释

1. 标号:标号是机械指令语句寄存地址的符号表示,代表该指令目标代码的第一个字节地址,后面必需紧跟冒号“:” 。2.指令助记符:指令助记符为语句的核心成份,表示了该语句的操作类型。

3.操作数:操作数表示指令助记符的操作对象。

4.注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。

3.1.2 伪指令语句格式

伪指令语句格式如下:

[符号名] 伪指令符 操作数 ;注释

1.符号名:符号名是伪指令语句的一个可选项。

2.伪指令符:伪指令符指定汇编程序要完成的具体操作,如数据概念伪指令DB、DW、DD,段概念伪指令SEGMENT,假定伪指令ASSUME等。

2. 操作数:伪指令后面的操作数能够是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必需以“逗号”分隔。4.注释:伪指令的注释必需以“;”开始,其作用同指令语句中的注释部份。

汇编语句表达式

3.2.1 常量

1.数值常量

2. 字符串常量

字符串常量是用单引号或双引号引发来的一个或多个字符。字符串常量是以各字符的ASCⅡ码表示的。如‘A’用41H 表示,字符串‘A1B2’用41H,31H,42H,32H表示。

3.2.2 变量

1.变量

(1)段属性

(2)偏移地址属性

(3)类型属性

2.变量的概念

表达式项是给变量或指定存储单元给予初值,它有以下几种形式:

(1)数值表达式

数据概念伪指令能够为一个或持续的存储单元设置数值初值。 【例】为数据段分派存储单元。

DATA SEGMENT

A DB 11H,12H,13H

B DW 1122H,3344H

C DD H

DATA ENDS

上述变量的存储单元分派及初始化情形如下图所示。

数据段中数据存储分派图

(2) 字符串表达式

字符串表达式中的字符串必需用引号引发来。DB、DW、DD伪指令将字符串中的各字符均以ASCⅡ码形式寄存在相应的存储单元,但表示形式各不相同。

【例】为字符串分派存储单元。

DATA SEGMENT

STR1 DB ‘1234’STR2 DW ‘AB’,‘CD’,‘A’STR3 DD ‘AB’DATA ENDS

其存储单元分派如下图所示。

(3)地址表达式(只适用DW和DD两个伪指令)

若是该地址表达式为一变量(或标号)名,用DW伪指令则是取它的偏移地址来初始化变量,用DD伪指令则是取它的段首址和偏移地址来初始化变量。

例如:BUF1 DW A

BUF2 DD B

(4) ? 表达式

?表示不肯定的值

(5)带DUP的表达式

在表达式中利用重复数据操作符DUP,能够为持续的存储单元提供重复数据,其格式为: N DUP(表达式)

其中N为重复因子,只能取正整数,表示概念了N个重复数据存储单元,其类型由它前面的数据概念伪指令肯定,而每一个数据存储单元中的初值由DUP后面圆括号中的表达式给定。

例如: BUF DB 100 DUP(0)

以上语句概念了以BUF为首址,大小为100个字节,初值为0的数据存储单元。

3.2.3 标号

标号是一条指令语句的符号地址。在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序挪用指令)中直接引用那个标号。因此,标号可作为转移类指令的操作数,即转移地址。

【例】符号地址表示。

NEXT:MOV AL, [SI] ;带标号NEXT的指令

DEC CX

JNE NEXT;标号NEXT作转移指令的操作数

标号也具有三种属性

1.段属性

2.偏移地址属性

3.类型属性

3.2.4 表达式与运算符

1.算术运算符

算术运算符包括:+(加)、-(减)、*(乘)、/(除)、MOD(求模)、SHL(左移)、SHR(右移)几种,它既能够用于数值表达式又可用于地址表达式。

【例】用算术运算符进行数值表达式运算。

NUM1 EQU 25*4 –50 ;NUM1=50

NUM2 EQU NUM1 / 7 ;NUM2=7

NUM3 DB NUM1 MOD 7 ;NUM3=1

VAR1 DB 1,2,3,4,5

VAR2 DB ‘12345’NUM4 EQU VAR2-VAR1 ;NUM4=5

NUM5 EQU 0FH

MOV AL,NUM5 SHL 4 ;(AL)=B

MOV BL,NUM5 SHR 4 ; (BL)=00000000B

2. 辑运算符

逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运算。由于逻辑运算是按位操作,且在汇编进程中完成,因此运算的结果仍为整数常量。

【例】用逻辑运算符进行运算。

MOV AL,34H AND 0FH;04H→AL

MOV BL,05H OR 30H;35H→BL

MOV CX,NOT 00FFH;0FF00H→CX

MOV DX,789AH XOR 000FH;7895H→DX

3.关系运算符 关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。

【例】用关系运算符进行数值表达式运算。

NUM1 DB 10 LT 5 ;NUM1=0

NUM2 DB 0AAAAH GT 7FFFH ;NUM2=0FFFFH

MOV AX,‘A‘ EQ 41H ;0FFFFH→AX

MOV BX,NUM2 LT NUM1 ;0→BX

4。属性运算符

PTR运算符

格式: 类型 PTR 地址表达式

PTR与EQU连用,可概念与PTR右边地址表达式类型不同的新变量名或新标号,但不另分派存储单元。

5。数值返回运算符

(1)SEG 运算符

格式:SEG 变量或标号

功能:分离出其后变量或标号所在段的段首址。例如:

MOV AX,SEG ARR

MOV DS,AX

(2)OFFSET运算符

格式:OFFSET 变量或标号

功能:分离出其后变量或标号的偏移地址。例如:

MOV BX,OFFSET BUF

(3)TYPE运算符

格式:TYPE 变量或标号

功能:分离出其后变量或标号的类型。若是是变量,将返回该变量的类型对应字节数;若是是标号,则返回代表标号类型的数值。它们之间的关系见表所示。

(4)LENGTH运算符

格式:LENGTH 变量

功能:掏出变量所含的数据存储单元个数。

【例】掏出变量占存储单元个数。

DATA SEGMENT

A DB ‘ABCDEF’B DW 10 DUP(1,2DUP(2))

C DB 3,20 DUP(0)

DATA ENDS

┆ MOV AX,LENGTH A ;1→AX

MOV BX,LENGTH B ;10→BX

MOV CX,LENGTH C ;1→CX

(5)SIZE运算符

格式:SIZE 变量

功能:掏出变量所含的数据存储区大小。其返回值为:

LENGTH 变量 * TYPE 变量

例如:上例中A、B、C三变量:

SIZE A = LENGTH A*TYPE A = 1

SIZE B = LENGTH B*TYPE B = 20

SIZE C = LENGTH C*TYPE C = 1

(6)字节分离运算符

字节分离运算符包括:HIGH和LOW。

格式:HIGH 常量或地址表达式

LOW 常量或地址表达式

功能:HIGH 用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。

3.2.5 运算符的优先级

伪指令

3.3.1 数据概念伪指令

常常利用的数据概念伪指令有DB,DW,DD,DQ,DT。

格式:[变量名] 数据概念伪指令 表达式 [,…]

功能:概念数据存储区,类型由数据概念伪指令肯定,初值由表达式给定。

3.3.2 符号概念伪指令

1.等价伪指令

格式:符号名 EQU 表达式

功能:为常量、表达式及其他各类符号概念一个等价的符号名,但它不申请存储单元。

用途:① 用符号表示常量、数值表达式,即概念符号常量。利用符号常量可使程序简单明了,增强程序的可读性和通用性。 ② EQU与属性运算符PTR或THIS联合利用,能够给变量或标号概念新的类型属性并从头命名,但维持其段偏移地址属性不变。

③ 利用EQU能够用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄放器名、宏概念名等。

2。等号伪指令

格式:符号名 = 表达式

功能:为常量、表达式及其他各类符号概念一个等价的符号名,并能对所概念的符号多次重复概念,且以最后一次概念的值为准。

【例】概念等价符号名。

COST = 20

M = MOV

LOST = LOST+10 ;30→LOST

M = ADD ;M=ADD

3。概念符号名伪指令

格式:变量名或标号 LABEL 类型

功能:概念与原有变量类型不同的新变量或为指令语句概念有指定类型的标号。通常与数据概念伪指令连用,其功能类似语句“变量名或标号 EQU THIS 类型”。

【例】概念新类型的变量。

DDBUF LABEL DWORD

BUF DB 200 DUP(0)

A LABEL FAR

B: LEA DX,BUF

3.3.3 段概念伪指令SEGMENT/END

1.段名

段名是为该段起的名字,用来指出汇编程序为该段分派的存储区起始位置。

2.定位方式

(1)PARA:表示本段必需从能被16整除的地址处开始寄存,即段起始地址最低四位必需是0。

(2)WORD:表示本段要从一个偶数地址处开始寄存,即段起始地址的最低一名必需是0。

(3)BYTE:表示本段起始地址能够从任一地址处开始寄存。

(4)PAGE:表示本段要从能被256整除的地址处开始寄存,即起始地址的最低八位必需是0。

3.类别

【例】对连接程序进行连接后存储区各段相对位置散布。

DATA1 SEGMENT ‘DATA’CODE SEGMENT ‘CODE’STACK1 SEGMENT ‘STACK’DATA2 SEGMENT ‘DATA’STACK2 SEGMENT ‘STACK’经连接程序连接后,各段的相对位置如下:

DATA1 SEGMENT ‘DATA’DATA2 SEGMENT ‘DATA’STACK1 SEGMENT ‘STACK’STACK2 SEGMENT ‘STACK’CODE SEGMENT ‘CODE’