4.1 伪指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6
⑵指示性语句——由伪指令构成的语句,不能执 行,用来定义变量、分配存储单元、指示程序开 始和结束等。 名字 区别 伪指令 操作数 ;注释
在形式上:带不带冒号,是否可转向它.
在本质上:汇编时能否形成对应的机器码.
注:当标识符后跟冒号时,表示是标号,它代表该 行指令的起始地址;当标识符后不带冒号时,表示 变量或子程序名;伪指令前的名字不加冒号。
P+0 +1 +2 P1+0 +1 P2+0 +1 +2 +3 +4 +5 +6 +7 0AH 04H 10H 64H 00H 3CH 00 00 00 0FDH 0FFH 00 00 10 4 10H 100
60
0FFFDH
20
例2:定义字符串
MESS DB ‘HELLO’ MM DW ‘AB’
26
DATA SEGMENT A A DB 10×20 STR1 DB ‘HI OK!’,0DH,0AH, ‘$’ STR1 DATA1 DW 2 DUP(0) SUM DW ? TABLE DB 2 DUP(3 DUP (3),7) DATA ENDS
……
C8H
‘H’
SUM TABLE
- - 3 3 3 7 3
4Leabharlann Baidu2 汇编语言中的数据
(2)字符串型常数
字符串型常数是指用单引号括起来的若干字符。汇 编语言把字符串中的每一个字符表示成它的ASCII 码值存放在内存中。如‘AB’的值是41H、42H, ‘345‘为33H、34H、35H。
(3)符号常数
用符号名来代替常数。如:BUF EQU 34,定义后 BUF就是符号常数,其值是34。
4.2 汇编语言中的数据
3.标号
标号是指令的符号地址,标号是可有可无的。标号常作为转 移指令的操作数,确定程序转移的目标地址。与变量类似, 标号也有3个属性。 • 段属性 • 偏移属性 • 类型属性(distance)
4.3 伪指令语句
常用的伪指令有: • 段定义伪指令 • 程序结束伪指令 • 符号定义伪指令 • 数据定义伪指令 • 过程定义伪指令
ASSUME CS:CODE,DS:DATA,SS:STACK
MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX内容送DS,DS才有实际段值 CODE ENDS
32
5.汇编结束伪指令
格式:END
[标号]
功能:该语句标志整个程序的结束,是源程序
的最后一条语句。 当汇编程序对源程序进行汇编过程中 , 如遇到 END,得知源程序到此结束。 •其中可选的标号用于指定程序开始执行点,连接程 序将据此设置CS : IP值 例如: END START ;表明该程序的启动地址为START
17
等号(赋值)伪指令
格式:<符号名> = <表达式> 功能:与EQU类似,唯一的区别是“=”可以随时 对符号名赋新值,而不必使用PURGE伪指令。 例: PORT = 88H DATA = PORT+2
; 定义符号PORT代表88H ; 定义符号DATA代表PORT+2
18
2.数据定义伪指令
变量是内存中数据区的名字,又叫变量定义伪指令。 格式为: 变量名 伪指令助记符 操作数 ;注释 变量名后面无冒号,可有可无。
段定义伪指令的格式如下: 段名 SEGMENT [定位类型] [组合类型] [’类别’] ┇ 段名 ENDS
方括号中为可选项,规定了逻辑段的一些其他特性
29
SEGMENT 和 ENDS
这两个伪指令总是成对出现,二者前面的段名 一致。二者之间的删节部分,对数据段、附加段 及堆栈段,一般是符号、变量定义等伪指令。对 于代码段则是指令及伪指令。 例如:DATA SEGMENT DW 20 DUP(?) DATA ENDS 此外,还必须明确段和段寄存器的关系,这可 由ASSUME语句来实现。
23
字节变量的应用
data X Y data segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
;对X为始的第2个数据减1,故成为-6
mov al,X ;此处X表示它的第1个数据,故AL←'a' dec X+1
mov Y,al ;Y这个字符串成为 'aBC'
25
练习:数据定义伪指令
例: DATA SEGMENT A DB 10×20 STR1 DB ‘HI OK!’,0DH,0AH, ‘$’ DATA1 DW 2 DUP(0) SUM DW ? TABLE DB 2 DUP(3 DUP (3),7) DATA ENDS 问:(1)若执行下列指令后,(AX)=? LEA BX,TABLE MOV AX,[BX+3] (2)变量 A,STR1,DATA1,SUM,TABLE 的 EA=?
data array data
segment db 45 , 45H ,36 ,9 ends …… ;等价于 mov ax,data mov ax , seg array mov ds , ax mov bx , offset array ;等价于 lea bx,array mov cl , array+2 bx=0
功能:分配存贮单元并赋初值。
操作数可以是常数或表达式,相当于初值。 伪指令助记符有如下几种:
DB DW DD 定义字节 (Define Byte) 定义字(Define Word) 定义双字(Define Doubleword)
19
例1
P DB 10 , 4 , 10H P1 DW 100 P2 DD 3×20, 0FFFDH
2
4.1 汇编语言程序格式
指令和伪指令
• 指令——使CPU产生动作、并在程序执行 时才处理的语句. • 伪指令——不产生CPU动作、在程序执行 前由汇编程序处理的说明性语句. • 伪指令与具体的处理器类型无关,但与汇 编程序的版本有关
4
⑴指令性语句——由指令构成的语句,是计算机可 执行的, 出现在程序的代码段中每个语句由1~4 个部分组成,格式为: [标号:] 指令助记符 [操作数 [,操作数]] [;注释] ( 1) ( 2) ( 3) ( 4) 其中: 用方括号括起来的部分,可以有也可以没有; 每部分之间用空格(至少一个)分开; 一行最多可有132个字符。
第四章 汇编语言程序设计
•汇编语言的伪指令、运算符 •汇编语言程序的结构
•汇编语言程序的上机过程
•基本程序设计
1
为什么要学习汇编语言?
• • • • • • 1 2 3 4 5 6 能够学习到处理器是如何工作的; 理解计算机的基本系统结构; 探究数据和指令的内部表述; 能够创建小巧有效的程序; 允许程序员绕过高层语言的限制编程; 有些工作必须用汇编语言完成。
30
4.段寄存器说明伪指令
ASSUME 段寄存器:段名 [,段寄存器名:段名, ...]
功能:指明某一个段地址应存于哪一个段寄存器中 由于ASSUME伪指令只指明某一个段地址应存于哪 一个段寄存器中,并没有包含将段地址送入该寄存 器的操作。因此要将真实段地址装入段寄存器还需 用汇编指令来实现。 如:CODE SEGMENT
4.2 汇编语言中的数据
2.变量
变量在除代码段以外的其他段中被定义,用来定义存放在 存储器单元中的数据,在汇编程序中可以修改变量的值。变 量由变量名表示,变量名按照标识符的命名规则定义。定 义变量可用变量定义伪指令。变量表示定义数据项中第一 个字节在现行段中的地址偏移量。
变量有3个属性:
• 段属性 • 偏移地址属性 • 类型属性
ABC
00 01 ╳ ╳ ╳ ╳ ╳ 36 00 ╳ ╳
例3:ABC DB 0,1,?,?,?
LPI DW ?,54,?
?——表示初值不确定 即未赋初值
LPI
0 1 ? ? ?
? 54 ?
22
复制操作DUP(duplicate)
DUP的格式为: 重复次数 DUP(重复参数)
如: DO-2 DB 2 DUP(0,1,2,?) 与 DO-2 DB 0,1,2,?,0,1,2,? 等价
1.常数
常数的值是固定的,没有任何属性。常数一般有3 种类型:数值型常数、字符串型常数和符号常数。
4.2 汇编语言中的数据
(1)数值型常数
• 二进制数:以字母B结尾,如01011010B。 • 八进制数:以字母Q或O结尾,如732Q、21O。 • 十进制数:以字母D结尾(或省略),如1948D、3528。 • 十六进制数:以字母H结尾,如3A40H、0E50H。 注意:当十六进制常数的第一位(即最高位)是字母A~F 时,必须在第一个字母前加写一个数字0,以便和标号名或 变量名相区别。
1,2,3,4,5,6,7
;数据定义伪指令,在主存中开辟7个连续的字 节单元,初值依次为1~7,BUFFER表示首地址
10
4.2 汇编语言中的数据
汇编指令中,数据是操作数的基本组成部分。第3章 讲到的操作数有寄存器操作数、存储器操作数和立 即数,汇编程序能识别的数据项有常数、变量、标 号和表达式。
7
汇编语言语句实例
MOV CX,0 ;传送指令,具有2个操作数
DELAY: NOP
;带有标号
LOOP DELAY ;标号delay作循环指令的操作数
标号是反映指令位置(逻辑地址)的标识符,用冒号分隔 名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟
空格或制表符分隔,没有冒号
BUFFER
DB
;等效于 mov cl,array[2] cl=36 ;等效于 mov cl, [bx+2]
39
PTR操作符
类型名 PTR 名字/标号 • PTR操作符使名字或标号具有指定的类型 • 类型名: BYTE/WORD/DWORD 或 NEAR/FAR
mov ax,word ptr array ;array是一个字节变量 jmp far ptr n_label ;n_label是一个标号
16
1.符号定义伪指令EQU(Equate)
格式: <符号名> EQU <表达式> 功能:给符号名赋值。名字根据标号规则定义,表达式 应该是可以计算得出一个具体值。 例: PORT EQU 88H ; 定义符号PORT代表88H
DATA EQU PORT+2 ; 定义符号DATA代表PORT+2
注意:① 用EQU定义的符号,不能重新再定义,除 非用PURGE伪指令解除。 ② 如果在表达式中用了其他符号,必须事先定义。
• 使用PTR操作符,可以临时改变名字或标号的类型
41
4.2 汇编语言程序的结构
一般来说,一个完整的汇编源程序由三个段组成, 即堆栈段、数据段和代码段。 堆栈段:在内存中建立一个堆栈区域,以便在中 断、子程序调用时使用。注意堆栈溢出。 数据段:存放常数、变量等程序中需要操作的数据。
START:
MOV
AX,DATA
; 数据段基址→AX
5
标号
• 由下列字符组成:大小写字母;数字0~9;某些 特殊字符(@、_、· 、?、$)。
• 标号的有效长度是31。 • 第一个字符不能是数字,“?”不能单独作为标号。 标号: START 标号: MAIN% MY_PROGRAM 1BETA 有效 无效
36
6.运算符(常用) • 地址操作符
SEG ;取段址 OFFSET ;取偏址 • 类型操作符 PTR ;定类型
37
地址操作符
取得名字或标号的段地址和偏移地址两个属性 [ ] 将括起的表达式作为存储器地址 : 采用指定的段地址寄存器 OFFSET 名字/标号 返回名字或标号的偏移地址 SEG 名字/标号 返回名字或标号的段地址 例:FIVE EQU 5 MOV AX,FIVE ;AX=5 MOV AX,SEG FIVE ;AX=5 所在地址的段地址 MOV AX,OFFSET FIVE ;AX=5 所在地址的偏移量地址 38
MESS+0 +1 +2 +3 +4 MM ‘H’ ’E’ ’L’ ’L’ ’O’ ’B’ ‘A’ 47H 45H 4CH 4CH 4FH 42H 41H
低地址
注意下面的不同: DB ’AB’ 41 42 ‘A ’ ‘B ’
DW
’AB’
42
41
‘B ’
‘A ’
低地址
高地址
21
高地址
? ——保留存储空间,但不存入数据.
‘I’
20H ‘O’ ‘K’ ‘!’ 0DH
LEA BX,TABLE MOV AX,[BX+3] ;(AX)= 0307H 变量 A,STR1,DATA1,SUM 的 EA
DATA1
0AH
‘$’ 0 0 0 0
3
3 7
……
为 0, 1,
10, 14
3. 段定义伪指令
因8086/8088 CPU的存储器是分段的,这就需要有段 定义语句。 与段有关的伪指令主要有: SEGMENT、ENDS、ASSUME