- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;6个字节内容依次为:02 03 04 04 02 03 04 04
4.2.2:例题4.2 变量的应用
;代码段
mov dl,bvar1
;DL=100
dec bvar2+1
;bvar2+1=5
mov abc[3],dl
;abc=’abcd’
mov ax,word ptr dvar[0] ;取双字到DX.AX
CODE1
…… ENDS END START
AL=12H BX=3412H
WBUFFER
DS
4.1.3:2. 表达式与运算符
SHORT:用来指定JMP指令中转移地址的属性
HIGH与LOW:对数值或地址表达式分离出高 字节或低字节。
格式: HIGH LOW
例如:
表达式 表达式
CONST EQU 4455H MOV AH,HIGH CONST ;AH=44H MOV AL,LOW CONST ;AL=55H
可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
;数据段
X db 'a',-5 db 2 dup(100),?
Y db 'ABC'
字节变量定义实例
4.2.2:字节变量的应用
mov al,X ;此处X表示它的第1个数据,故AL←'a' dec X+1 ;对X为始的第2个数据减1,故成为-6 mov Y,al ;现在Y这个字符串成为 'aBC'
符号名 EQU 数值表达式 符号名 EQU <字符串> ;MASM 5.x不支持 如:
DATA_PORT EQU 3F8H STAT_PORT EQU 3F8H+2 SEED EQU 10 FUNC EQU SEED*SEED+2*SEED+1
更多例题参考课本P98【例题4-8】
4.2.1 符号定义伪指令
4.2.3 模块定义与连接伪指令
定位类型: 连接时用于指定该段应开始于什么样的物理地 址。可选择下列4种之一: BYTE : 从 当 前 可 用 的 字 节 地 址 XXXX XXXX XXXX XXXX XXXX(任一地址)开始; WORD: 从当前可用的字地址XXXX XXXX XXXX XXXX XXX0(偶数地址)开始; PARA(缺省): 从当前可用的节地址XXXX XXXX XXXX XXXX 0000(16的倍数)开始; PAGE: 从当前可用的页地址XXXX XXXX XXXX 0000 0000(256的倍数)开始。 其中,1节(paragraph) 为16字节,1页为16节即256字节。 • 合理选择定位类型,可充分利用存储器空间。
string db ’ABCDEFGHIJ’
;定义字符串:使用字节定义DB伪指令
crlfs db 13,10,’$’
;回车符0DH、换行符0AH和字符'$'=24H
array1 dw maxint dup(0)
;10个初值为0的字量,可以认为是数组
array db 2 dup(2,3,2 dup(4))
wvar2 dw ? ;wvar2是没有初值的字变量
4.2.2:例题4.2 变量的定义(续)
dvar dd 12347777h,87651111h,?
;双字变量:2个双字数据,一个双字空间
abc db ’a’,’b’,’c’,? ;定义字符,实际是字节变量
maxint equ 0ah
;符号常量:maxint=10
THIS:用来建立新的存储器地址操作数,但不 分配存储单元。新的操作数类型在THIS中指定, 而其段地址和偏移量就是汇编时的当前值。 格式:
THIS 类型 一般通过EQU伪指令,为符号名赋予一个THIS 指定的类型
4.1.3:2. 表达式与运算符
DATA1 SEGMENT
WBUFFER EQU THIS WORD
4.1.3:2. 表达式与运算符
运算符的优先级: 当一个表达式中有多个运算符时,先算
优先级高的,再算低的,如优先级相同, 则按从左至右的顺序运算。
参考课本P98表4-3
4.2 汇编程序伪指令
伪指令(伪操作)不生成机器代码,只告诉汇编 程序如何汇编 可完成数据定义、存储区分配、程序开始和结束 等功能。 包括:
变量定义的汇编语言格式为: 变量名 伪指令 初值表
变量名为用户自定义标识符,表示初值表 首元素的逻辑地址,常称为符号地址。变 量名也可以没有 初值表是用逗号分隔的参数,主要由常量、 数值表达式或“?”组成。其中“?”表 示未赋初值
4.2.2:字节变量的定义DB(Define Byte)
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量,存放一 个8位数据:
4.2.3 模块定义与连接伪指令
组合类型: 连接时用于指定同名的各段之间的组 合方式。可选择下列6种之一:
PUBLIC STACK COMMON MEMORY AT表达式 NONE(缺省) 若省略组合类型或说明为NONE类型,则表示各 个段不组合,各有自己的段基值。 对堆栈段,必须用STACK类型说明,不能省略。
PTR——改变存储器地址操作数的操作类型,但其 段地址和偏移地址不变。
如: DATA1 DW 100 DUP(?)
× MOV AL, DATA1 √ MOV AL, BYTE PTR DATA1 √ MOV AX, DATA1
05 DATA1 A2 00 10 85
DS
4.1.3:2. 表达式与运算符
符号定义伪指令“=” : 格式:
符号名 = 数值表达式
它与EQU的区别是EQU不能重复定义符号名,而 “=”操作可以重复定义。
例如:
X= 7
;等效于:X equ 7
X= X+5 ;“X EQU X+5”是错误的
4.2.1 符号定义伪指令
如: X=3 Y=6 Y=Y*Y-X …… MOV AX, Y
minintHale Waihona Puke Baidu= 5
;符号常量:minint数值为5,不占内存空间
bvar2 db -1,minint,minint+5
;内存中数值依次为FFH,5,0AH
db ?,2 dup(20h)
;预留一个字节空间,重复定义了2个数值20H
wvar1 dw 2010h,4*4
;字变量:两个数据是2010H、0010H,共占4个字节
第4章
4.1.3:2. 表达式与运算符
综合运算符 包括:PTR、THIS、HIGH、LOW、SHORT
PTR:对名字或标号的类型属性进行设置 格式:
类型名 PTR 变量/标号/地址表达式
其 中 类 型 名 可 以 是 BYTE 、 WORD 、 DWORD 等 , 或者是NEAR、FAR。
4.1.3:2. 表达式与运算符
dw 8000h,?,'AB' equ 64h dw maxint dw maxint dup(0)
注字意变:量定义实例
数据定义语句定义 的数据在存储器中占有 相应的单元,而EQU只 是定义了一个数据,在 汇编后以实际数据的形 式体现在程序中。也就 是说,EQU语句不会占 有存储单元。
4.2.2:双字变量的定义DD(Define Double word)
格式为:
END [LABEL]
标号(LABEL)指示程序开始执行的起始地址,连 接程序据此设置CS和IP值。
如果多个程序模块相连接,则只有主程序要使用 标号,其他子程序模块只用END而不必指定标号。
————不要糊涂————
程序终止和汇编结束是两码事
4.2.3 模块定义与连接伪指令
段定义伪指令:SEGMENT/ENDS 在段定义中,SEGMENT和ENDS总是成对使用的 格式: 段名 SEGMENT[定位类型][组合类型][‘类别’]
DD伪指令用于分配一个或多个双字单元, 并可以将它们初始化为指定值 初值表中每个数据是一个32位的双字量:
可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位 的偏移地址(低位字)的远指针
vardd DD 0,?,12345678h farpoint DD 00400078h
… ;本段程序内容(指令语句或伪指令语句) 段名 ENDS
当用于定义数据段、附加数据段和堆栈段时,处于 SEGMENT/ENDS伪指令中间的语句, 只能包括伪指令 语句,不能包括指令语句。 一般情况下,带有‘[ ]’的部分可以不用。但是,如果需 要用连接程序把本程序与其他程序模块相连接时,就需要 使用这些说明,并且各项的顺序不能变。
符号定义伪指令 数据定义伪指令 模块定义与连接伪指令 过程定义伪指令
4.2.1 符号定义伪指令
为常量或表达式赋符号名。
符号名 EQU 表达式 符号名 = 表达式:允许重复定义 符号名 LABEL 类型 PURGE 符号1,符号2,…,符号N:解除定 义
4.2.1 符号定义伪指令
符号定义伪指令“EQU” : 格式:
通过上述操作,最后使Y=33,后面的MOV语 句中,当生成目标代码时将用33取代Y。即
MOV AX, 21H (33D)
4.2.1 符号定义伪指令
LABEL:定义标号名称和属性, 它和下一条指 令共享存储器单元。
符号名 LABEL 类型
BYTE-ARRAY LABEL BYTE WORD-ARRAY DW 100 DUP(?)
mov dx,word ptr dvar[2]
add ax,word ptr dvar[4] ;加双字到DX.AX
adc dx,word ptr dvar[6]
mov word ptr dvar[8],ax ;保存双字的求和结果
mov word ptr dvar[10],dx
4.2.2:例题4.2 变量的应用(续)
4.2.2 数据定义伪指令
定义数据的操作符有:
字节定义——DB 字定义——DW
双字定义——DD 四字定义——DQ 十字节定义——DT
重复定义—— m DUP(n) (重复m次个数据 n )
多个存储单元如果初值相同,可以用复制操作符DUP 进行定义:
重复次数 DUP(重复参数)
4.2.2 数据定义伪指令
MOV WORD-ARRAY, 0 ; 是把第一个字置为0。
MOV BYTE-ARRAY, 0 ; 是把第一个字节置为0。
4.2.2 数据定义伪指令
数据定义伪指令也称为定义变量的伪指令 变量实质上是指内存单元的数据,虽然内存单元 地址不变,但其中存放的数据可以改变 变量需要事先定义才能使用 数据定义伪指令为变量申请固定长度的存储空间, 并可以同时将相应的存储单元初始化,也可以只 分配存储空间而不存入确定的数值 定义后的变量可以利用变量名等方法引用其中的 数据,即变量的数值
4.2.2:字变量的定义DW(Define Word)
DW伪指令用于分配一个或多个字单元,并 可以将它们初始化为指定值
初值表中每个数据是字量,一个字单元可 用于存放任何16位数据:
一个段地址 一个偏移地址 两个字符 0~65535之间的无符号数 -32768~+32767之间的带符号数
;数据段
count maxint number array
mov cx,maxint ;CX=10
mov bx,0
;BX=0
again: add string[bx],3 ;string每个数值加3
inc bx
loop again
;循环
lea dx,abc
;从abc开始
mov ah,9
;09H号DOS功能调用
int 21h
;显示结果:abcdDEFGHIJKLM
BUFFER DB 12H, 34H, 00H, 91H
DATA1 ENDS CODE1 SEGMENT
BUFFER 12 34
ASSUME CS: CODE1, DS: DATA1
00 91
START: MOV AX, DATA1
85
MOV DS, AX
MOV AL, BUFFER
MOV BX, WBUFFER
4.2.2 变量的应用
变量具有存储单元的逻辑地址 程序代码中
通过变量名引用其指向的首个数据 通过变量名加减位移量存取以首个数据为基地 址的前后数据
例题4.2 变量的定义和应用
4.2.2: 例题4.2 变量的定义
;数据段
bvar1 db 100,01100100b,64h,'d'
;字节变量:不同进制表达同一个数值,内存中有4个64H
4.2.3 模块定义与连接伪指令
NAME/TITLE:在程序的开始用来定义模块的名字, 汇编时从这里开始,可缺少。(P101) 格式:
NAME MODULE TITLE TEXT;指定列表文件的每一页上打印 标题
4.2.3 模块定义与连接伪指令
END:表示汇编程序到此结束将源程序翻译成目标 模块代码的过程。