第三章 汇编语言格式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、什么是伪指令? 2、伪指令和指令语句有什么区别?
伪指令语句 是一种汇编程序在汇编时用来控制汇编过程以及向汇编
程序提供汇编相关信息的指示性语句。
与指令语句的区别
指令语句:汇编程序对源程序进行汇编时,将指令语句翻译成 机器指令,指令语句与机器指令一一对应,机器指令在程序执行 期间执行. 伪操作:汇编程序对源程序进行汇编时,由汇编程序执行伪指 令语句其本身并不直接产生可供计算机硬件执行的机器目标 代码,它仅是一种非执行语句。
DATA1
… 01 41 31 32 33 42 43 44 01 02 03 02 03 …
DATA2
… 1C AB -- -- 00 00 14 00 14 00 FF FF …
DATA3
… 34 02 00 00 -- -- -- -- …
标识符
标识符的类型
在程序中定义, 可作为符号地址使用
203H 0DH
DB 23H
204H 0AH
ORG 200H
205H —
X3
X2 DB ‘ABC’,0DH,0AH
X3 DB ?
对齐伪指令ALIGN
ALIGN <number>
100H 12H
D1
number必须是2的幂, 例如:2、4、8、……
典型的.EXE程序的源程序框架总结
一个完整的源程序由几个段构成。
XXXX XXXX
SEGMENT ENDS
各段具有各自不同的功能。
数据段中存放着数据、代码段中存放着程序、 堆栈段为保存数据提供了空间。
每个段由数目不等的语句行组成。
每行语句都是各种符号的组合,符号之间由 空格分隔开。
3.2 伪操作
变量:指向存放某个操作数的存储单元;
标号:指向存放某个指令存储单元;
子程序名:指向存放子程序的起始存储单元;
构成标识符的符号集合
英文字母(a~z,不区分大小写)
数字(0~9)
特殊符号(?、@、_、$)
标识符的构成规则
不可以以数字开头;
助记符、定义 符、寄存器名
称等
不能使用单独的“?”作为标识符;
段体 数据段中主要为数据定义伪指令; 代码段中主要为汇编指令。
段说明伪指令ASSUME
格式
ASSUME 段寄存器名:段名[,段寄存器名:段名,…]
功能: 指明段和段寄存器的对应关系。
例如:ASSUME CS:CODE1,DS:DATA1,ES:DATA2 取消段指定:
ASSUME 段寄存器名:NOTHING
DATA1 DB 100 DUP(0)
DATA1 00 00 … 00
DATA2 DB
3 DUP (3 DUP (2) , 7)
100个
02 02 02 07 02 02 02 07 02 02 02 07
DATA2
内存变量定义伪指令练习
请写出下列变量定义伪指令的内存分配情况。 DATA1 DB 01H , ’A’ , ’123’ , ’BCD’ DB 1 , 2 DUP(2 , 3) DATA2 DW 0AB1CH , ? , 0 DW 20 , 14H , -1 DATA3 DD 234H , ?
汇编语言程序 设计
—— 第三章
第三章 汇编语言程序格式
要求
1 掌握并能使用汇编语言的常用伪操作符及伪指令 语句
2 掌握汇编语言源程序格式计算机实现步骤 3 学会编写简单的汇编语言程序
3.1 汇编程序功能
编辑程序 P.ASM 汇编程序 P.OBJ 连接程序 P.EXE
汇编语言程序的建立及汇编过程
<标识符> Βιβλιοθήκη BaiduQU <表达式>
该语句仅为标识符来赋功值能,并不会分配存储空间, 汇编用程左序边会的将标源识程符序来中代的替标右识边符的替表换达成式对应的数值;
举例
DATA EQU 2
;定义一个常数
NUEMQU语E句Q在U同D一A程TA序+2中,对;定一义个一符个号数名值只表能达定式义一次。
PLUS EQU ADD
;定义一个可执行命令
等值伪指令举例
DATASG SEGMENT PORT1 EQU 100 PLUS EQU ADD NUM EQU PORT1+20 NEWE EQU NUM COUNT EQU CX DATASG SEGMENT
MOV AX, PORT1 PLUS AX, NUM MOV AX, NEWE MOV COUNT,AX
举例
等号伪指令举例
DATASG SEGMENT PORT1 = 100 PORT1 = PORT1+20 NEWE = PORT1 DATASG SEGMENT
MOV AX, PORT1 MOV CX, NEWE
MOV AX, PO12R0T1 MOV CX, N1E2W0E
符号定义伪指令注意点
;程序开始
;对段寄存器DS初始化 ;(AL)=5 ;(AL)=8 ;(AL)=38H ;(DL)=38H
;调用int 21H的2号-打印功能
MOV AH,4CH INT 21H CODES ENDS END START
;调用int 21H的4CH号-退回DOS ;代码段定义结束 ;程序结束
编写的源程序要经过汇编程序转换成目标文件,这 时源程序要告知编译器数据区的定义、指令系统的选择、 段的定义、程序的开始和结束等信息这类工作由伪指令 完成。
100H 12H
B1
101H 67H
W1
102H 45H
103H
定位伪指令ORG
ORG <数值表达式>
100H 23H
X1
功能
101H 00H
102H 23H
将其后的变量或指令从“数值表
达式”所指定的位置开始存放。
… 200H 41H
X2
201H 42H
ORG 100H
202H 43H
X1 DW 23H
关于堆栈段
堆栈段的定义 STACK1 SEGMENT STACK
DW 256 DUP(?) STACK1 ENDS
若源程序中不定义堆栈段,系统会自动指定一个64KB的 区域作为堆栈段,但连接时会产生一个警告信息: warning xxxx: no stack segment 此警告信息不影响程序正常运行。
MOV AX, PO10R0T1 PALDUDS AX, N1U2M0 MOV AX, N1E2W0E MOV COCUXNT,AX
符号定义伪指令——等号伪指令=
等号伪指令 <标识符> = <常数表达式>
功能
与EQU语句相似,但在同一程序中可对一个符号名重 复定义。
DATA = 2 DATA = DATA+2
伪操作(又称伪指令)的作用是指导汇编程序如何汇编源程序。
段定义伪指令 变量定义伪指令 符号定义伪指令 调整偏移量伪指令
3.2.1段定义伪指令
格式
段名 SEGMENT [对齐类型] [组合类型] [类别]
……
;段体
段名 ENDS
段名 合法标识符,首尾段名要一致;区别于变量和标号;
计算机上运行汇编语言程序的步骤是:
(1) 用编辑程序建立ASM源文件 (2) 用MASM程序把ASM文件转换成OBJ文件 (3) 用LINK程序把OBJ文件转换成EXE文件 (4) 用DOS命令键入文件名运行该程序
汇编程序的主要功能
(1) 检查源程序 (2) 检查源程序中的语法错,并给出错误信息 (3) 产生源程序的目标程序,并给出列表文件 (4) 展开宏指令
用法 常用于一个变量定义伪指令,或带标号的指令之前,为一
个变量或指令指定两个不同类型的名称;
WDATA LABEL WORD LOOP1 LABEL FAR BDATA DB 12H , 34H LOOP2: MOV AX , BX
符号名定义伪指令举例
DATASG SEGMENT B_ARRAY LABEL BYTE
4*8
A3 DD 4*8
00 =32
内存分配情况如右:
00 =20H 00
……
内存变量定义伪指令举例2
——字符、字符串
……
例2. 操作数是字符或字符串时,以 ASCII码的形式存放。
STR1 DB ‘A’,’B’
STR1 41 42
STR2 42 41
超在过对两文S个T档字R进符2的行字编D符W辑串之只前能‘,用ABD需B’新伪建指令文定档义。。STR3 41
3.2.2 简单的变量定义伪指令
指令格式 [变量名] 助记符 操作数 [ ; 注释]
合法的标识 符
即每个操作数在内存中存 放所占的字节数
DB(字节)、DW(字)、DD(双字)
•可以是常量数据,也可以 是表达式,或是字符、字符 串; •可以为变量只分配存储空 间,而不赋具体的数值; •可以使用复制说明符定义 一段连续的存储空间;
表示将20个字节中的第 一个字节的地址赋予两 个不同类型的变量:字 节类型变量B_ARRAY和 字节型变量W_ARRAY
W_ARRAY DW 10(DUP(1234H))
DATASG SEGMENT
执行指令后,AX 、 DL 中的值分别是什么?
MOV AX, W_ARRAY
MOV DL, B_ARRAY
DF(三字)、DQ(四字)、DT(十字节)
变量定义伪指令举例1——常数和表达式
例1. 变量定义伪指令的操作数可是常数, A1
……
0A
10
也可是表达式,但在内存中保存的均 A2 64 100
为二进制补码形式的常数。 A1 DB 10
00
00
100H
01
FF
-1
A2 DW 100,100H,-1
FF
A3 20
取名尽量有含义,但不能采用汇编语言的保留 字;
最大长度为31个字符。
例如: ABCDH 标识符
0ABCDH 立即数
3.2.3 符号定义伪指令
1 等值伪指令
EQU
2 等号伪指令
=
3 符号名定 义伪指令
LABEL
符号定义伪指令——等值类似伪于处C指理语命言令令里:面E的Q预U
#define pi 3.14 等值伪指令EQU
汇编语言程序的语句除指令以外,还可以由伪指 令和宏指令组成
汇编语言源程序的框架
下面是一个典型的.EXE程序的源程序框架
DATAS SEGMENT FIVE DB 5
DATAS ENDS
STACKS SEGMENT DB 128 DUP (?)
STACKS ENDS
;定义数据段
;定义字节单元 ;数据段定AS义SU结M束E伪指令
06
--
BUF1 DB 5 , 6 , ?
BUF2 00
01
BUF2 DW 100H , ?
--
--
……
内存变量定义伪指令举例4 ——分配连续的存储空间
DUP复制说明符
重复次数n DUP (重复数据表) 该说明符可嵌套使用
例4. 操作数中可以使用DUP复制说明符,定义重复数据,分 配连续的存储空间。
由等值伪指令和等号伪指令定义的符号名,程序中任何位置 出现该符号名,汇编程序在翻译时首先用其对应的表达式对
代替,然后检查代替后的结果是否有语法错误;
被定义的符号名不占据内存空间;
符号定义伪指令——符号名定义伪指令
符号名定义伪指令LABEL <符号名> LABEL <类型>
功能 定义一个变量或标号,并指定其类型;
STR3 DD ‘BA’
42
00
STR4 DB ‘ABCD’
00
STR4 41
** 一般,在定义字符串时,经常使用DB来
42
定义,以使字符按存放顺序。
43
44
……
内存变量定义伪指令举例3 ——只分配存储空间
例3. 若在汇编期间只需要为变量分配
存储空间,而不赋初值,则可以使
BUF1
…… 05
用“?”作为操作数。
只是指明了段寄 存器与段之间的
;定义堆栈关段系,但并没有 ;128个字对节段寄的存化栈器空初间始 ;堆栈段定义结束
CODES SEGMENT
;定义代码段
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;对各段进行说明
START: MOV AX,DATAS MOV DS,AX MOV AL,FIVE ADD AL,3 ADD AL,30H MOV DL,AL MOV AH,2 INT 21H
执行指令MOV AX, W_ARRAY 是将具有10个字数据的数组中的 第一个字数据1234赋值给AX。指 令MOV DL, B_ARRAY是将具有 10个字数据的数组中的第一个字 节数据34H赋值给DL.
3.2.4 调整偏移量伪指令
使用目的
调整数据或代码存放的起始位置。
为什么要调整
为使系统的访存操作更为有效。
3.2.4 调整偏移量伪指令
常用的调整偏移 量伪指令
偶对齐伪指令 EVEN
调整偏移量伪指 令ORG
对齐伪指令ALIGN
偏移量计数器 引用符号$
偶对齐伪指令EVEN
伪指令格式 EVEN
功能
将其后的变量或指令从下一个偶地址单元开始存放。
例如:如下变量定义伪指令
B1 DB 12H EVEN W1 DW 4567H
相关文档
最新文档