第四章伪指令与源程序结构
合集下载
第4章 ARM伪指令及程序设计

1.1 ARM汇编伪指令--ADR
ARM中伪指令不是真正的ARM指令或Thumb指令,这些伪指令在编译器 对源程序进行汇编处理时被替换成相应的ARM或Thumb指令序列.ARM 伪指令包括ADR,ADRL,LDR和NOP. ADR--小范围的地址读取伪指令 该指令将基于PC的地址值或基于寄存器的地址值读取到寄存器 中.当地址值是字对齐时,地址的取址范围是-1020~1020字节. 在处理源程序时,ADR伪指令通常被编译器替换成一条ADD指令或 SUB指令来实现该ADR伪指令的功能.读取的地址必须和ADR指令在 同一个代码段中. 语法格式: ADR{cond} register,expr 例:start MOV r0,#10 ADR r4,start ; SUB r4,pc,#0xc
语法 LDR rd, =const For example LDR r0, =0xFF => LDR r0, =0x55555555=>
MOV r0, #0xFF LDR r0, [PC, #Imm12] … … DCD 0x55555555
1.3 ARM汇编伪指令--NOP
NOP--空操作伪指令 NOP伪指令在汇编时将被替换成ARM中的空操 作,如可能为 " MOV R0 ,R0 "等.NOP伪指令不 影响CPSR中的条件标志位.
2.1ARM汇编语言语句格式(1)
ARM 汇编语言程序中符号的定义规则: 符号区分大小写,同名的大,小写符号会被编译器认为是两 个不同的符号. 符号由大小写字母,数字以及下划线组成. 符号在其作用范围内必须唯一. 自定义的符号名不能与系统的保留字相同. 符号名不应与指令或伪操作同名. 程序中的变量和常量 变量;变量有数字变量,逻辑变量和串变量3种类型 数字常量;使用EQU伪操作来定义数字常量. 标号;标号代表一个地址,段内标号的地址在汇编时确定, 而段外标号的地址在连接时确定.
第4章 伪指令及汇编语言源程序

2019/4/12 9
第 4章
符号定义伪指令
2、 等号伪指令 = = 伪指令的格式与功能和 EQU 类似。不同的是, 在同一个程序中 = 可以对一个符号重复定义, EQU不能对同一个符号重复定义。 Y1=7 Y1=128 的定义是正确的。 而 Y1 EQU 7 Y1 EQU 128 的定义是错误的。
2019/4/12
24
第 4章
组合类型
组合类型规定本段与其他段的关系,有 4 种方式(默 认方式为NONE): NONE:连接时,表示本段与其他段在逻辑上没有 关系。 PUBLIC:连接时,本段将与其他同名、同类别的段 相邻地连接在一起,形成一个物理段,段的长度为 各PUBLIC段长度之和。 COMMON:连接时,本段将与其他同名、同类别 的段相覆盖,形成一个物理段,段的长度为最长的 COMMON段的长度。 STACK:表示此段为堆栈段,连接方式与PUBLIC 段相同。
2019/4/12
偏移地址低字节
偏移地址高字节
偏移地址低字节 偏移地址高字节
段地址低字节
段地址高字节
图4.2
15
第 4章
操作数是字符串
操作数为字符串时,内存中存放的是各字符的ASCII码。 例4-5 下面3个定义语句是等价的。 STR1 DB ‘ABCD’ STR1 DB ‘A’, ‘B’, ‘C’, ‘D’ STR1 DB 41H,42H,43H,44H 例4-6 下面2个定义语句是等价的 STR2 DB ‘AB’ STR2 DW ‘BA’ 当定义的字符串中字符多于2个时,只能使用DB定义,不 能使用DW。 STR3 DW ‘ABCD’ 是错误的定义方式。
2019/4/12
5
第 4章
操作码与操作数
第 4章
符号定义伪指令
2、 等号伪指令 = = 伪指令的格式与功能和 EQU 类似。不同的是, 在同一个程序中 = 可以对一个符号重复定义, EQU不能对同一个符号重复定义。 Y1=7 Y1=128 的定义是正确的。 而 Y1 EQU 7 Y1 EQU 128 的定义是错误的。
2019/4/12
24
第 4章
组合类型
组合类型规定本段与其他段的关系,有 4 种方式(默 认方式为NONE): NONE:连接时,表示本段与其他段在逻辑上没有 关系。 PUBLIC:连接时,本段将与其他同名、同类别的段 相邻地连接在一起,形成一个物理段,段的长度为 各PUBLIC段长度之和。 COMMON:连接时,本段将与其他同名、同类别 的段相覆盖,形成一个物理段,段的长度为最长的 COMMON段的长度。 STACK:表示此段为堆栈段,连接方式与PUBLIC 段相同。
2019/4/12
偏移地址低字节
偏移地址高字节
偏移地址低字节 偏移地址高字节
段地址低字节
段地址高字节
图4.2
15
第 4章
操作数是字符串
操作数为字符串时,内存中存放的是各字符的ASCII码。 例4-5 下面3个定义语句是等价的。 STR1 DB ‘ABCD’ STR1 DB ‘A’, ‘B’, ‘C’, ‘D’ STR1 DB 41H,42H,43H,44H 例4-6 下面2个定义语句是等价的 STR2 DB ‘AB’ STR2 DW ‘BA’ 当定义的字符串中字符多于2个时,只能使用DB定义,不 能使用DW。 STR3 DW ‘ABCD’ 是错误的定义方式。
2019/4/12
5
第 4章
操作码与操作数
汇编 第四章伪指令及汇编语言源程序结构

MOV AL, BUF1
ADD AL, BUF2 MOV SUM, AL
;取第一个加数
;两数加 ;和放入SUM单元
3
伪指令(指 示性)语句: 提供相关辅 助信息。
指令性语句: 完成一定功 能,能翻译 成机器码。
伪指令语句
DATA SEGMENT ;DATA段定义开始 BUF1 DB 34H BUF2 DB 27H SUM DB ? DATA ENDS ;DATA段定义结束 CODE SEGMENT ;CODE段定义开始 ASSUME CS:CODE ASSUME DS:DATA ;段性质规定 START: MOV AX,DATA MOV DS,AX ;给DS赋值 MOV AL, BUF1 ;取第一个加数 ADD AL, BUF2 ;两数加 MOV SUM, AL ;和放入SUM单元 MOV AH,4CH INT 21H ;返回DOS CODE ENDS ;CODE段定义结束 END START ;源程序结束
14
二、= 等号伪指令
格式:符号名 = 表达式 功能:为常量、表达式及其他各种符号定义一个等价的符号 名,并能对所定义的符号多次重复定义,且以最后一次定义 的值为准。 例:COST = 20 M = MOV LOST = COST+10 ;30→LOST M = ADD ;M=ADD 注 : “ = ” 伪 指 令 的 格 式 和 功 能 与 EQU 类 似 。 二者区别:在同一程序中,“=”可以对一个符号重 复定义,EQU不能对同一符号重复定义。
26
三、变量、标号的分析运算和合成运算
例: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 ┆
第4章 伪指令、汇编语言程序结构及上机过程

表达式 表达式有算术表达式、关系表达式、逻辑表达式, 其对应的运算符见课本37页。
4.2 伪指令
伪指令是向汇编程序提供诸如:哪个段是数据段。 哪个段是代码段,程序何时结束、数据据段中的ห้องสมุดไป่ตู้内存变量等相关信息。 (1)数据定义伪指令 (2)段定义伪指令
(3)假定伪指令ASSUME (4)程序结束伪指令 (5)过程定义伪指令 (6)其它
(5)程序的调试:DEBUG 下面介绍几个最常用的DEBUG命令: (1)先进入DEBUG 并装入要调试的程序(例: SSD.EXE)
DEBUG SSD.EXE
(2)用反汇编命令U来确定所要设定的断点地 址.
-U
(3)从U命令的显示情况可确定要设置的断点 的位置.在确定断点后,就可以用G命令使程 序启动运行,同时设置断点. 例:-G=0 001D ;执行程序(从0到001D 单元) 程序将停在断点处,并显示出所有寄存器发 及各标志位的当前值,最后一行给出下一条 将要执行指令的地址、机器语言及汇编语 言.我们可以从寄存器的内容来了解程序运 行是否正确.
0C 08 34 12 41 42
SUM A1
STR
说明: (1)这里的SUM,A1,STR其实质为符号地址, 不同于高级语言的内存变量,也就是说不 能按内存变量一样去访问对应的数据。 (2)定义的16位数在内存存放时,其形式为 低8位在低地址,高8位在高地址。 (3)定义的字符数据按其ASCII码存放。
第四章 伪指令、汇编语言源程序结构及上机过 程
4.1 4.2 4.3 4.4 汇编语言中的语句 伪指令 源程序结构 汇编语言的上机过程
4.1 汇编语言中的语句
1.语句种类 (1)指令语句:完成一定的操作,能够翻译成机器代码 的语句,第三章介绍的指令所形成的语句. (2)伪指令语句:只是为程序在翻译语言程序时提供 有关信息,并不翻译成机器代码的语句. 注:汇编语言中还可以出现宏指令语句(12章)。
汇编语言程序设计2(汇编语言源程序的结构、语句格式、伪指令)

7.设置中断向量 ( 25H功能 )
38
DOS 功能调用
调用格式:
MOV AH,功能号
<置相应参数>
INT 21H
39
1.从键盘输入单字符并显示
调用方法:
MOV AH,01 INT 21H 输入的字符在AL中
40
单字符输入例
GET_KEY: MOV INT CMP JZ CMP JZ JNZ YES: ┇ NO: ┇
<汇编语言语句> 段名 ENDS
16
SEGMENT和ENDS伪指令
这两个伪指令总是成对出现,二者前面的段名应一致。 SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。 对数据段和堆栈段,段中的语句一般是变量定义。 对代码段则是指令语句。
如: data SEGMENT <指令语句> data ENDS
23
宏
23
其它伪指令
NAME-------为目标程序设定一个名字 格式:
NAME 模块名
TITLE-------为程序清单指定打印标题 格式:
TITLE 标题名
24 24
4.3 功能调用
DOS 功能调用 BIOS功能调用
高级调用,操作系统提供 低级调用
25
3. 调用方法 设置入口参数
与其它模块中的同名段在满足定位类型的前 提 下具有的组合方式:
NONE: 不组合 PUBLIC: 依次连接(顺序由LINK程序确定) COMMON: 覆盖连接 STACK: 堆栈段的依次连接 AT 表达式:段定义在表达式值为段基的节边界 MEMORY: 相应段在同名段的最高地址处。
第4章 ARM程序设计基础-伪指令2

X:LAND:Y X:LOR:Y :LNOT:Y X:LEOR:Y ;表示将X和Y作逻辑与的操作 ;表示将X和Y作逻辑或的操作 ;表示将Y作逻辑非的操作 ;表示将X和Y作逻辑异或的操作
操作结果为{FALSE}或{TRUE}
Assemble Language of ARM
17
3、 字符串表达式及运算符
第4章 ARM程序设计基础
4.2 汇编语言的语句格式
ARM(Thumb)汇编语言的语句格式为: {标号} {指令或伪指令} {;注释} 标号必须从一行的行头开始,并且符号中不能包含空格。 指令不能从一行的行头开始,即在一行语句中,指令的前面必须有 空格或者标号。 在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或 全部用小写,但不允许在一条指令中大、小写混用。 寄存器可以大写或小写。 伪指令有些必须在一行的开头顶格书写,另外一些必须留有空格。 注释以分号“;”开头,到行末结束。 如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾 用“\”表示下一行与本行为同一条语句。 在源程序中,语句之间可以插入空行,增强可读性。
Assemble Language of ARM 8
变量替换的特殊情况: 如果需要字符$,则用$$来表示。 包含在两个竖线(|)之间的$不进行变量替换,但如果竖线是 在双引号内,则将进行变量替换。 使用“.”来表示变量名称的结束。
例如 STR1
SETS
“STRING”
STR2
SETS
X X X X X X X
= Y > Y < Y >= Y <= Y /= Y <> Y
;表示X等于Y ;表示X大于Y ;表示X小于Y ;表示X大于等于Y ;表示X小于等于Y ;表示X不等于Y ;表示X不等于Y
操作结果为{FALSE}或{TRUE}
Assemble Language of ARM
17
3、 字符串表达式及运算符
第4章 ARM程序设计基础
4.2 汇编语言的语句格式
ARM(Thumb)汇编语言的语句格式为: {标号} {指令或伪指令} {;注释} 标号必须从一行的行头开始,并且符号中不能包含空格。 指令不能从一行的行头开始,即在一行语句中,指令的前面必须有 空格或者标号。 在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或 全部用小写,但不允许在一条指令中大、小写混用。 寄存器可以大写或小写。 伪指令有些必须在一行的开头顶格书写,另外一些必须留有空格。 注释以分号“;”开头,到行末结束。 如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾 用“\”表示下一行与本行为同一条语句。 在源程序中,语句之间可以插入空行,增强可读性。
Assemble Language of ARM 8
变量替换的特殊情况: 如果需要字符$,则用$$来表示。 包含在两个竖线(|)之间的$不进行变量替换,但如果竖线是 在双引号内,则将进行变量替换。 使用“.”来表示变量名称的结束。
例如 STR1
SETS
“STRING”
STR2
SETS
X X X X X X X
= Y > Y < Y >= Y <= Y /= Y <> Y
;表示X等于Y ;表示X大于Y ;表示X小于Y ;表示X大于等于Y ;表示X小于等于Y ;表示X不等于Y ;表示X不等于Y
第四章 伪指令及程序设计

7 2018/11/13 ASSUME CS:段名,DS:段名,SS:段名,ES:段名
assume指定段与段寄存器之间的关系,但并不为段寄存 器设定初值,程序中如果使用数据段或者附加段,需要明确 对DS、ES赋值。只要正确书写源程序,CS、IP和SS、 SP的值将会由连接程序正确设置 设置方法: MOV AX,STACK MOV SS,AX
2018/11/13
6
汇编程序的基本结构要求
完整的汇编程序要包括:段定义、段分配、设置段地址、返 回DOS语句、程序结束 和程序体。必要时加上过程调用。 完整汇编语言程序的典型格式 1. 段定义格式: 段名 …… SEGMENT
段名
ENDS
至少有一个代码段,堆栈段如果不定义,由计算机自动分配。 段名是由字母数字组成的,可以任意定义。 计算机识别不同的段靠 段分配ASSUME 语句完成
2018/11/13 20 Nhomakorabea PTR例 MUL BYTE PTR[BX] JMP JMP JMP
;限定存储器操作数的类型
WORD PTR[BX] ;段内转移 DWORD PTR[BX] ;段间转移 CS:IP FAR PTR LO ;段间转移
2018/11/13
21
THIS: 格式:变量/标号 EQU THIS 类型/距离 功能:该变量或标号的段地址和偏移地址与下一个存储 单元的地址相同,并具有THIS后的属性 Eg4-45:FIRST EQU THIS BYTE TABLE DW 200DUP(?) EG4-46 :SP1 EQU THIS FAR MOV AX,100
2018/11/13 23
4-3 8086宏汇编语言常用伪指令
11
assume指定段与段寄存器之间的关系,但并不为段寄存 器设定初值,程序中如果使用数据段或者附加段,需要明确 对DS、ES赋值。只要正确书写源程序,CS、IP和SS、 SP的值将会由连接程序正确设置 设置方法: MOV AX,STACK MOV SS,AX
2018/11/13
6
汇编程序的基本结构要求
完整的汇编程序要包括:段定义、段分配、设置段地址、返 回DOS语句、程序结束 和程序体。必要时加上过程调用。 完整汇编语言程序的典型格式 1. 段定义格式: 段名 …… SEGMENT
段名
ENDS
至少有一个代码段,堆栈段如果不定义,由计算机自动分配。 段名是由字母数字组成的,可以任意定义。 计算机识别不同的段靠 段分配ASSUME 语句完成
2018/11/13 20 Nhomakorabea PTR例 MUL BYTE PTR[BX] JMP JMP JMP
;限定存储器操作数的类型
WORD PTR[BX] ;段内转移 DWORD PTR[BX] ;段间转移 CS:IP FAR PTR LO ;段间转移
2018/11/13
21
THIS: 格式:变量/标号 EQU THIS 类型/距离 功能:该变量或标号的段地址和偏移地址与下一个存储 单元的地址相同,并具有THIS后的属性 Eg4-45:FIRST EQU THIS BYTE TABLE DW 200DUP(?) EG4-46 :SP1 EQU THIS FAR MOV AX,100
2018/11/13 23
4-3 8086宏汇编语言常用伪指令
11
第四章 伪指令

数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串 从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式 不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的 变量无确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式 操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用 DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式 格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了 n个相同的数据存储单元。
在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算
符、数值返回运算符、属性运算符和字节分离运算符。
(一)、表达式
(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性。
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT)
Байду номын сангаас
表达式1,表达式2,„
其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址; DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 DB定义的是字节类型的变量,每个表达式被分配1个字节单元。 DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。 DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字节)。 DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。 DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TOP DW 50 DUP(?)
STAK ENDS ;STAK段定义
CODE
SEGMENT ASSUME ASSUME
;CODE段定义开始 CS:CODE,DS:DATA SS:STAK,ES:EXTRA ;规定段的性质
START:
MOV MOV MOV
AX,DATA DS,AX AX,EXTRA
LENGTH
〈变量〉
对于用DUP定义的变量,计算DUP前面的重复次数,其 它变量的LENGTH值为1。 SIZE 〈变量〉
计算分配给该变量的字节数,其值为TYPE和LENGTH的 乘积。 OFFSET 〈变量或标号〉
计算变量或标号的段内偏移地址。 如:MOV SI,OFFSET TAB1 功能是将TAB1的偏移 地址送入SI寄存器中,等价于 LEA SI,TAB1
例 4-8 对于如下定义:
DA1 DA2 DA3 DW 345FH EQU BYTE EQU DA2+1 PTR DA1
利用PTR还可与EQU一起定义与右边表达式类型不 同,的新变量/标号,但不分配存储单元,新变量/标 号的类型与表达式类型相同。 如: TAB1 DW 78E2H TAB2 EQU TAB3 EQU BYTE PTR TAB1 TAB2+1
②标号 ,如:JMP
NEXT1
③变量:指存放在内存单元中的变化的数据。 2) 表达式(分为数值表达式和地址表达式两种) 表达式是由常数、寄存器、标号、变量和操作 符组合而成。汇编语言循序使用的操作符有:
①算术操作符
有+、-、*、/和MOD(取余)
算术运算符可用于数值表达式和地址表达式中, 在使用地址表达式时要注意地址表达式的物理意义。 例如: √ MOV √ MOV √ × MOV AL,10*5+4 ;数值表达式
AX,SI
6、变量的类型 用伪指令定义的变量是有类型的,在指令中使用 变量做操作数时,要操作数类型的匹配。 如:有如下数据定义: OPR1 DB 23H,4AH × ×
OPR2 DW 127FH,25A6H 则:MOV AX,OPR1 MOV BL,OPR2 应使用合成操作符PTR: MOV AX,WORD PTR OPR1; AX=4A23H
第四章
伪指令及汇编语言程序结构
4.1汇编语言语句格式
4.2 伪指令
4.3汇编语言源程序结构 4.4汇编语言的上机过程
4.1汇编语言的语句格式 一、语句种类
汇编语言程序由有序的汇编语言语句组成。 汇编语句
指令语句
伪指令语句
指令语句:完成一定操作功能,能够翻译成机器代码 的语句,即指令语句与机器指令有对应关系。 伪指令语句(指示性语句):为汇编程序在翻译汇编 语言源程序提供有关信息,如分配存储单元,给符号 赋值、段的定义等,它不翻译成机器代码。
MOV BL,BYTE PTR OPR2 ; BL=7FH
三、段定义伪指令
DATA SEGMENT BUF1 DB 2DH ;DATA段定义开始
DATA
EXTRA
ENDS
SEGMENT BUF2 DB ?
;DATA段定义结束
;EXTRA段定义开始
EXTRA STAK
ENDS SEGMENT
;EXTRA段定义结束 ;STAK段定义开始
SEG
〈变量或标号〉
计算变量或标号的段地址。
如:MOV AX,SEG 送入AX寄存中。 TAB1功能是将TAB1的段地址
例:书4-7 2) 合成操作符(PTR和THIS) 也叫属性操作符,用来改变原有变量或标号的类型。
<类型>
PTR 〈表达式〉
;表达式一般是变量/标号 BYTE/WORD/DWORD
MOV
MOV MOV
ES,AX
AX,STAK SS,AX …… CODE ENDS END START
MOV
AH,4CH
返回DOS
INT 21H
三、段定义伪指令 格式: 段名 SEGMENT [定位] [组合][类型][段长度]
……
段名 ENDS 1、定位类型
;段体
用于通知连接程序,逻辑段的目标代码在存储 器中如何存放。即下一个逻辑段的起始地址与上段 结尾的间隔值。
二、语句格式 指令语句和伪指令语句的格式类似,格式如 下:
[名字]
其中:
操作码
[操作数/参数] [;注释]
方括号[ ]的项是可选项,可以省略。 一般每行为一个语句,也可用&符号紧接回 车之后,表示该行内容的继续。 每行语句长≤128字符。
1、名字
名字:由用户定义的标识符,非数字开头的1~31个字 符,分标号和变量两种。 标号:在代码段中定义,后跟冒号:,位于指令语 句左边 。标号有段、偏移及类型三种属性。 段属性:定义标号的段其始地址,标号的段属性总 是在CS寄存器中。 偏移地址:代表从代码段起始地址到标号位置之间 的字节数。 类型属性:分NEAR和FAR两类,NEAR表示在同一代码 段内引用,FAR表示在段外引用。
PARA:段地址从能被16整除的地址开始依次存放
BYTE:段地址从下一个可用字节开始。
WORD:段地址从偶地址开始依次存放
PAGE:段地址从能被256整除的地址开始依次存放 2、组合类型 告诉连接程序如何组合相同名字的段
NONE:表示与其他模块的段无关 PUBLIC:连接时,本段与其他同名、同类别的段依 次连接合并成一个物理段,长度为各段之和。 COMMON:将同名、同类别的段相覆盖,长度为各段 最长者
变量:是位于伪指令或宏指令左边的名字, 其后不带冒号,变量可以在任何段出现。
变量也有段、偏移和类型三种属性
段属性:变量所代表数据单元的段地址(DS、 ES或SS)。 偏移属性:变量所代表数据单元的段内偏移 地址。 类型属性:数据变量来说是指该变量对应的 数据的字节长度。如字节、字、双字。
标号是一条指令的符号地址,它代表 指令目标代码的第一个字节地址。在一个 程序段或子程序入口处通常设置一个标号, 因此,标号可以作为转移(JMP)或调用 (CALL)指令的操作数。而用于伪指令中 的名字,可以是变量名、段名、过程名、 宏名等,一般不作为JMP和CALL指令的操作 数。 同一个程序中,一个标号或变量只能定义 一次,不能重复定义。标号通常用作转移 指令的地址,变量通常提供操作数的首地 址。
BUF2
DW 1,2,3 DUP(6) DW 1,2,6,6,6
等价于:BUF2
ARB1
ARB2
DB 10 DUP(2)
DB 10H DUP(’ABC’)
ARB3
DW 20 DUP(?)
DUP操作符允许嵌套
例:BUF3
DB 2 DUP(5,6,3 DUP(7))
5,6,7,7,7
等价于:BUF3 DB 5,6,7,7,7,5,6,7,7,7
THIS < 属性或类型> 与PTR类似,可以给变量或标号定义另一属性或类型。 (但不分配新的存储单元)。一般与EQU或=伪指令连 用,产生标号或变量。偏移地址是该语句所在位置的下 一个可用存储单元的地址。
VAR1 EQU THIS BYTE
VAR2 DW 6918H
这样VAR1和VAR2有相同的段属性和寻址空间。 MOV AL,VAR1 ; MOV BX, VAR2; AL=18H BX=6918H
指令语句:例 LOP: 标号
伪指令语句:例 BUF1
MOV
AX,0000H ;将AX清零 操作数
34H
操作码
DB
注释
;定义变量BUF1, 注释
初值34H。
变量名 伪指令符 操作数
2、操作项
可以是指令、伪指令或宏指令的助记符。
3、操作数项
可以用常数、寄存器名、存储器操作数、标号、变 量或表达式表示。
1) 常数
8086/8088宏汇编中允许如下几种常数: ①二、八、十、十六进制常数
②十进制科学表示法表示的实数,如:12.35E-2
③字符串常数,如‘AB’值是4142H
‘ABCD’ →41H,42H,43H,44H
2) 存储器操作数 ①寻址方式表示的存储器操作数,如:[BX]、[SI+2] 等。
SI,OFFSET BUF+12 ;地址表达式 CX,NUM2-NUM1 ;两地址差送CX ;无意义
MOV CX,NUM2+NUM1
②逻辑操作符 有AND、OR、NOT和XOR四个。只用于数值 表达式中。
例如:AND AL,78H AND 0FH
等价于:AND AL,08H
OR AL,3 AND 47H
或助记符。
注
EQU不能给一个符号重复定义
2、等号伪指令 = 与EQU类似,但在同一个程序中,=可以对一 个符号重新定义。 3、解除定义伪指令PURGE 格式:PURGE〈符号1,符号2,……符号N〉
功能:解除指定符号的定义,解除符号定义后,可用 EQU重新定义。 例: X1 EQU
X1 EQU 48
VAR2
DB
DB
10,11,12
0FFH,0
BUF1
BUF2
DW
DD
1234H,5678H
12345678H
DATA ENDS
0AH 0BH 0CH FFH 00H 34H 12H 78H 56H 78H 56H 34H 12H
2、操作数是字符串 当定义的字符串中多于2个字符时,只能用DB定义。 如: STR1 注: STR2 STR2 STR2 3、操作数是? 此时,只分配存储单元,不定义初值。 例: NUM1 DB 5,?,7 DW ‘ABCD’ DB ‘AB’ × 等价
8
PURGE X1
二、数据定义伪指令 格式:[变量] 操作符 操作数 [;注释]