第四章伪指令与源程序结构
第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章 伪指令及汇编语言源程序

第 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

操作结果为{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
第四章 伪指令及程序设计

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个字节单元。
第4章 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令)

注意: 指令性语句汇编时生成机器码;
指示性语句汇编时不生成机器码。
11
语句的构成元素:
标号——指令的符号地址,用来代表指令在存储器中的 地址。只能出现在指令性语句中,标号后应加上冒号。 名字——段、过程、变量的名字,用来代表它们在存储 器中的地址。只能出现在指示性语句中,名字后不加冒 号。 指令助记符——8086助记符、伪指令 操作数——即指令的操作对象 – 对指令性语句(真指令)——0,1,2个 – 对指示性语句(伪指令)——根据需要而定 – 操作数之间以逗号分隔 – 操作数可以是:寄存器、存储单元、常数或表达式 例如:AX,[DI+BX+10],200,16*8+TABLE,等等
逻辑运算符只能用于数字表达式中。 例: MOV CL,36H AND 0FH 经汇编后:MOV CL,06H 注意: 不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指 令与 AND AX, 3F00H等价。
21
26
4.2 伪指令
由汇编程序执行的指令,它本身不被汇编 成机器指令。常用的伪指令有: 数据定义 伪指令 符号定义 伪指令 段定义和段寄存器指定伪指令 过程定义 伪指令 结束 伪指令
27
4.2.1 数据定义伪指令
用于定义变量,即内存单元或数据区。数 据定义伪指令的格式为:
变量名 数据定义伪指令 操作数,操作数,…
1)算术运算符—— +、-、*、/,MOD
用于数字表达式,
例: MOV AX,4*1024 汇编后的形式为: MOV AX,4096 用于地址表达式, 例: LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为: LEA SI,[1003H]
汇编语言程序格式、伪指令

第4章 汇编语言程序设计
主要内容:
汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计
1
微机与接口技术
4.1 汇编语言源程序
1.机器语言(Machine Language)
用二进制表示指令和数据。 优点:执行速度快,占有内存少。 缺点:不直观,不易编写、阅读和理解,面向硬件,不 能移植。
MASM
汇编程序
PRODR.OBJ 文件
Link
连接程序
PRODR.EXE 文件
汇编语言程序的建立及汇编过程
4
微机与接口技术
上机过程: 1.调用编辑程序(例如:记事本)建立源文件。 以×××.asm命名文件。 2.用汇编程序masm(或asm)对源文件汇编产生目标文件 ×××.obj。 如果汇编出错则需重新调用编辑程序修改错误,直至汇编 通过为止。
2.汇编语言(Assembly Language)
用助记符书写指令,地址和数据也可用符号表示。 优点:编写、阅读和修改较方便,不易出错,执行速度与机 器语言相近。 缺点:面向硬件,不能移植。
2
微机与接口技术 汇编:把汇编语言源程序翻译成机器语言目标程序的过程。 汇编程序:完成汇编工作的系统软件。 •小汇编(ASM):需要64K内存支持 •宏汇编(MASM):需要96K以上的内存支持,功能更强。 汇编程序的主要功能: 1)检测源程序。 2)测出源程序中的语法错误,并给出出错信息。 3)产生源程序的目标程序,并给出列表文件。 4)展开宏指令。
24
微机与接口技术
(2) 逻辑运算符 AND、OR、XOR、NOT:只用于数值表达式 注:逻辑运算符和逻辑指令的区别:前者在汇编时 进行,后者在程序执行时由CPU执行 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。
伪指令

4.3汇编语言程序格式 4.3汇编语言程序格式
4.3汇编语言程序格式 4.3汇编语言程序格式 汇编语言程序中的每个语句可以由四项组成 [name] operation operand [;comment]
其中名字项是一个符号。 操作项是一个操作码的助记符,它可以是指令, 操作项是一个操作码的助记符,它可以是指令,它可以 是指令,伪操作或宏指令名。 操作数项由一个或多个表达式组成,它提供为执行所 要求的操作而需要的信息。 注释项用来说明程序或语句的功能。‘ 注释项用来说明程序或语句的功能。‘;’为识别注 释项的开始。‘ 释项的开始。‘;’也可以从一行的第一个字符开始, 此时整行都是注释,常用来说明下面一段程序的功能。
4.2.4对准伪操作 4.2.4对准伪操作
对准伪操作 EVEN伪操作使下一个字节地址成为偶数。 EVEN伪操作使下一个字节地址成为偶数。 例: DATA_SEG SEGMENT EVEN WORD_ARRAY DW 100 DUP(100) DATA_SEG ENDS
4.2.4对准伪操作 4.2.4对准伪操作
4.2伪操作 4.2伪操作
4、操作数还可以是 repeat_count DUP (operand,operand,……,operand)repeat_count (operand,operand,……,operand)repeat_count 用来指定括号中的操作数的重复次数。 例: ARRAY1 DB 2 DUP(0,1,2,?) ARRAY2 DB 100 DUP(?)
4.1汇编程序功能 4.1汇编程序功能
汇编程序的主要功能: 1、检查源程序 2、测出源程序中的语法错误,并给出出错信 息。 3、产生源程序的目标程序,并可给出列表文 件(同时列出汇编语言和机器语言的文件, 称为列表文件) 4、展开宏指令。
第四章伪指令

第四章伪指令汇编语言源程序由一系列语句构成,这些语句既可以是指令,也可以是伪指令。
指令是由CPU负责执行的,每一条指令都和一条机器语言相对应。
而伪指令是由汇编程序负责执行,完成一些内存单元分配、段之间的连接关系等操作,所以伪指令并不会生成机器指令,也就不会被CPU执行。
在本章中,重点讲解一些常用的伪指令及其功能。
4.1伪指令的分类及伪指令语句格式伪指令又称为伪操作,它虽然不会被CPU执行,但却可以指示汇编程序按照用户的意图,完成数据的定义、存储器的分配、指示程序结束等功能。
所以伪指令在汇编语言程序设计过程中具有重要的意义,希望读者在学习过程中应该加以高度重视。
4.1.1 伪指令的分类8088/8086的伪指令大致可分为以下八类:·数据定义伪指令;·符号定义伪指令;·段定义伪指令;·过程定义伪指令;·结束伪指令;·条件汇编伪指令;·结构、记录定义伪指令;·其他伪指令。
其中,条件汇编伪指令与结构、记录定义伪指令将在第八章予以介绍。
4.1.2 伪指令语句格式伪指令语句格式一般由四部分组成。
语句格式: [变量] 伪指令助记符参数1,参数2····参数n[;注释]说明:伪指令助记符规定了伪指令的功能。
一般伪指令都有参数,用于说明伪指令的操作对象,参数的类型和个数随着伪指令的不同而不同。
有时参数是常数或数值表达式,有时参数是一般的符号,有时是具有特殊意义的符号。
伪指令语句中的变量可有可无,如果伪指令语句中出现变量,则汇编程序使其记以第一个字节的偏移地址。
注释部分也是可有可无的,用于说明该伪指令的功能。
例如 VAR1 DW 1234H,5678H ;定义VAR1为字变量该语句中的VAR1为变量;DW为伪指令助记符;1234H与5678H为参数;分号后面给出的文字为注释。
4.2汇编语言中的数据项数据项是指令或伪指令语句操作对象的基本组成部分。
第4章 伪指令与源程序格式汇总

第4章伪指令与源程序格式汇编语言程序的语句有三种,即指令、伪指令,还可以有宏指令。
关于宏指令将在第7章介绍,本章介绍部分常用的伪指令(又称伪操作)。
这些伪指令在程序中是必不可少的,主要用来定义数据变量和程序结构。
本章还介绍指令中的操作数和运算符,通过本章的学习,可以学会使用简便而有效率的指令格式,正确定义数据变量,熟知源程序的格式,编写完整的汇编语言程序。
4.1 伪指令伪指令和指令不同的是,指令是在程序运行期间由计算机的CPU来执行的,而伪指令是在汇编程序对源程序进行汇编期间由汇编程序处理的操作。
它们可以完成如定义数据、定义程序模式、分配存储区、指示程序结束、处理器选择等功能。
这里只介绍一些常用的伪指令。
有些和宏汇编有关的伪指令在介绍宏汇编时再作说明。
4.1.1 处理机选择伪指令由于80x86的所有处理器都支持8086指令系统,但每一种高档的机型又都增加了一些新的指令。
为了能使用这些新增指令,在编写程序时要用处理机选择伪指令对所用的处理机作出选择,也就是说,要告诉汇编程序应该选择哪一种指令系统。
处理机选择伪指令有以下几种:.8086 选择8086指令系统.286 选择8O286指令系统.286P 选择保护方式下的80286指令系统.386 选择80386指令系统.386P 选择保护方式下的8O386指令系统.486 选择80486指令系统.486P 选择保护方式下的8O486指令系统.586 选择Pentium指令系统.586P 选择保护方式下的Pentium指令系统指令中的点‘.’是需要的。
这类伪指令一般放在整个程序的最前面。
如不给出,则汇编程序认为其默认选择是8086指令系统。
4.1.2 段定义伪指令我们结合第2章已介绍的程序实例2来看段定义,注意有分号的注释行,程序如下:例4.1data segment ;定义数据段datastring db ‘hello,world!$’data endscode segment ;定义代码段codeassume cs:code,ds:data ;指定段寄存器和段的关系start:mov ax,data ;对ds赋data段基地址mov ds,axmov dx,offset stringmov ah,9int 21hmov ah,4chint 21hcode endsend start ;汇编结束, 程序起始点start:1.段定义伪指令汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,连接程序对针目标程序把不同的段和模块连接在一起,确定各个段的段地址。
第4章 伪指令及汇编语言源程序结构

(3) 关系操作符: EQ、NE、LT、LE、GT、GE 计算结果为逻辑值: 真 0FFFFH 假 0000H OPR1 OPR2 … EQU EQU 25 7 ;00011001B ;00000111B 等价指令: MOV AX, 0 等价指令: MOV AX,0FFFFH
;OPR1和OPR2为符号常数
4.掌握段定义及程序分段。
本章重点: 数据定义伪指令、段定义
计划学时: 2--3学时
第2页 第2页
汇编语言程序设计
第4章伪指令及汇编语言源程序结构
4.1 语句类型及格式
4.1.1 语句类型
指令(性)语句
语 句 类 型
完成一定操作功能,能够翻译成机器代码的语句
指示性语句(伪指令语句) 为汇编程序在翻译汇编语言源程序时提供有关信 息,并不翻译成机器代码
第4页 第4页
汇编语言程序设计
第4章伪指令及汇编语言源程序结构
操作码用于指明操作的性质或功能。 书写规则:操作码与操作数之间用空性语句:
格式:[名字:] 操作码 [操作数[,操作数]] [;注释] 伪指令语句: 格式:[名字] 伪操作 [操作数[,操作数,…]] [;注释] 含义:由用户按一定规则定义的标识符 名字定义满足的规则
;取ARRAY数组个数送CX
; 符号地址常数 有意义 ; 时意义不明确 ; 错误用法 ; 正确用法
第7页 第7页
汇编语言程序设计
第4章伪指令及汇编语言源程序结构
(2) 逻辑和移位运算符: AND、OR、XOR、NOT、SHL、SHR
OPR1 OPR2
指令
EQU EQU
25 7
;00011001B ;00000111B
MOV AX, OPR1 EQ OPR2 MOV AX, OPR1 GT OPR2
汇编程序结构及伪指令

END start
D:\masm>DEBUG hello.exe -U :查看代码段 129F:0000 FC CLD 129F:0001 B89D12 MOV AX , 129D 129F:0004 8ED8 MOV DS , AX 129F:0006 8D360000 LEA SI , [0000] 129F:000A B89E12 MOV AX , 129E 129F:000D 8EC0 MOV ES , AX 129F:000F BF0000 MOV DI , 0000 129F:0012 B90600 MOV CX , 0006 129F:0015 F3 REPZ 129F:0016 A4 MOVSB 129F:0017 B44C MOV AH , 4C 129F:0019 CD21 INT 21 、、、 -D 129d:0 l10 ;查看数据段1的内容 129D:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... -D 129e:0 l10 ;查看数据段2的内容 129E:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8
第4、5章 伪指令

伪/宏指令和目标链接文件
4 目标文件链接
链接器命令文件和链接器伪指令
例6.24 MEMORY指令举例
/ * Sample Command file with MEMORY directive * / file1.obj file2.obj -o prog.out MEMORY { PAGE0: ROM: ORIGIN=0C00h ,LENGTH=1000h PAGE1: SCRATCH: ORIGIN =60h, LENGTH =20h RAM: ORIGIN =200h, LENGTH =200h }
.usect :为一个有名称的段保留一段存储空间,但不初始 化。 .asect:创建具有绝对地址的初始化命名段。 小结:1) .text,.data, .sect, .asect创建已初始化段。 2) .bss, .usect 创建未初始化段。 3) .sect ,.usect创建自定义段和子段
未初始化段的建立
伪/宏指令和目标链接文件
4 目标文件链接
链接器命令文件和链接器伪指令
例6.25 SECTIONS { .text { f1.obj(.text) f2.obj(sec1) f3.obj f3.obj(.text,sec2) }
}
输入段不必相互同名也不必和输出段同名。如果列举输入文件时不带段, 那么它所有的段将被包含在输出段之内。
语法:run = allocation 或 run > allocation 如果在一个段中 load 和 run 的地址相同, run 可以省略。
链接器为每个输出段分配两个目标存储器地址:装载地址和运行地址。通 常这两个地址是相同的。但有时用户可能把代码装入存储器的一个区域却在另 一个区域运行它。例如在引导加载程序,用load设置它的装载地址,用run设置 它的运行地址。
- 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
二、数据定义伪指令 格式:[变量] 操作符 操作数 [;注释]