汇编语言第4章 伪指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
修改:
MOV AX,WORD PTR OPER1 ;执行后AX内容0201H MOV AL,BYTE PTR OPER2 ;执行后AL内容34H
变量
变量经常在操作数段出现,是数据的存储单元地址。 变量有三种属性 段 定义变量的段起始地址,此值必须在一个段寄 存器(DS、ES、SS)中 偏移 变量的偏移地址是16位无符号数,它代表从段 起始地址到定义变量的位置之间的字节数。 类型 例:A1 DB 1,2,3,4,5,8,90,67,23,100 COUNT EQU $-A1
;数据段
START:MOV AX,DATA MOV DS,AX …… MOV AX,4C00H INT 21H CODE ENDS END START
.CODE .STARTUP ;代码段 …… .EXIT ;返回DOS END
段寄存器的赋值
完整段定义框架
STACK SEGMENT …… STACK ENDS DATA SEGMENT …… DATA ENDS CODE SEGMENT
表达式是由一些常数、标号、变量和运算符组合而成 注意:表达式的运算是在汇编的过程中完成的
算术运算符
逻辑运算符
关系运算符
数值回送操作符
属性操作符
算术运算符:
+ - × / MOD(模除、取余) 注意: 在数字表达式中,可以使用这5种运算符 在地址表达式中,可以使用+- 例如: SUM和SUM+1单元的字节操作数相加。 MOV AL,SUM ADD AL,SUM+1 ;地址表达式,直接寻址 在汇编时将计算出SUM+1的值。
类型属性
用来指明该标号是在本段内引用,还是在其它段中引用。如 在段内引用则称NEAR,指针长度为 2字节;如在段外引用 则称FAR,指针长度为4字节。
赋值伪指令
格式:符号名 EQU 表达式 功能:给表达式赋予一个名字,使EQU两边等价 表达式可以是: 有效的操作数形式 能求出常数值的表达式 有效的助记符
段寄存器的初值 CS=3000H DS=3000H SS=3000H ES=3000H
DATA SEGMENT ARRAY DB 1,4,6,9,2 SUM DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA SATRT: MOV AX, DATA MOV DS, AX MOV AX, 0 MOV SI, 0 MOV CX, 5 AGN: ADD AL, ARRAY[SI] ADC AH, 0 INC SI LOOP AGN MOV SUM, AX MOV AH, 4CH INT 21H CODE ENDS END START
MOV BX,((PORT LT 5)AND 20) OR ((PORT GE 5)AND 30)
此运算汇编时完成 当 PORT<5时 汇编后 MOV BX,20 当 PORT≥5时 汇编后 MOV BX,30
数值回送运算符
TYPE、LENGTH、SIZE、OFFSET、SEG
格式: TYPE 变量/标号
内存空间表达式 ?
汇编后,这些单元的初值为任意
例: ONE DB ?
;为变量ONE分配一个字节的空间
TWO DW ?,?,?
;为变量TWO 分配了3个字单元空间
THREE DD ? ; 为变量THREE分配了一个4字节的存储单元
为存储单元定义数据:用数值初始化存储单元
例: A1 DB 10 A2 DW 01100100B,100H A3 DW OFFSET NEXT ;标号NEXT的偏移地址值0028存入A3单元 ADD1 DD NEXT ;标号NEXT的32位地址指针存入ADD1单元 B1 DW A1 ;B1中存储A1的偏移地址 …… 3000: 0028 NEXT:MOV BX,AX …… 标 号
例1: 把首地址为BLOCK的字数组的第5个字送到AX中 MOV AX, BLOCK+(5-1)*2 例2: 将数组长度存到CX中 ARRAY DD 1,2,3,4,5,6,7 COUNT …… MOV CX,(COUNT-ARRAY)/4
COUNT EQU ($-ARRAY)/4 COUNT DW ($-ARRAY)/4
当前位置计时器 $ $:当前地址的偏移值
X1 1000:2000H X1 DB 1, 2, 3, 5 LEN1 EQU $-X1 $=1000:2004H,LEN1=4 X2 DW 1234H LEN2 EQU $-X2 $=1000:2006H,LEN1=2
X2 1000:2004H
01H
02H 03H 05H 34H 12H
例:COUNT EQU 100 ;数值赋予符号名
MOV CX, COUNT ; 源操作数的寻址方式 ? NUM1 EQU COUNT+100 ;表达式值200赋予NUM1
PORT1 EQU CX
;PORT1是CX的代名词,即CX本身赋以符号名
CBD EQU DAA ;指令助记符本身赋予符号名
B EQU [BP+8] ;相对变址引用本身赋予符号名
注意: 单引号和双引号作用相同
重复操作符 DUP
格式: 重复次数 DUP(操作数,…,操作数)
例1: ARRAY DW 100 DUP(?) 功能:从ARRAY开始保留100个字类型存储缓冲区 (共200个字节)
ARRAY DB 2 DUP(0,1,2,?)
等价于ARRAY DB 0,1,2,?,0,1,2,?
实际应用:求数组的长度
ARRAY1 DB 1, 3, 4, 5, 6 COUNT1 EQU $-ARRAY1 …… MOV CX, COUNT1 ARRAY2 DW 1,3,4,5,6 COUNT2 EQU ($-ARRAY2)/2 …… MOV CX, COUNT2 $
1000:2006H
运算符与表达式
DA1 DB 1,2,3,4,5 DA2 DW 1,2,3,4,5 DA3 DD 1,2,3,4,5
用DB伪指令定义字符串操作数时,可以分别写 多个字符,也可以写一个多字符的串形式。
STRING1 DB ‘H’,‘E’,‘L’,‘L’,‘O’ STRING2 DB ‘HELLO’ STRING3 DB “HELLO”
DUP操作符可以嵌套
A1 DB 3DUP(1,2,3,2DUP(‘ABC’),3DUP(8,7,2DUP(?)))
分配给A1的数据缓冲区共多少个字节?
OPER1 DB 1,2 OPER2 DW 1234H,5678H … MOV AX, OPER1 ;类型不匹配,出错 MOV AL, OPER2 ;类型不匹配,出错
数组求和
完整段定义
.MODEL SMALL .DATA ARRAY DB 1,4,6,9,2 SUM DW ? .STACK DW 100DUP(?) .CODE .STARTUP MOV AX, 0 MOV SI, 0 MOV CX, 5 AGN: ADD AL, ARRAY[SI] ADC AH, 0 INC SI LOOP AGN MOV SUM, AX .EXIT END
如果是变量,则汇编程序将返回该变量以字节数表 示的类型值:
DB为1、DW为2、DD为4、 DF为6、DQ为8、DT为10
如果是标号,则汇编程序将回送标号类型值:
NEAR为-1、FAR为-2
ARRAY DW 1,2,3 ADD SI,TYPE ARRAY ;汇编时回送值2 汇编后:ADD SI,2
汇编语言程序结构
汇编语言程序的基本结构
完整段定义框架
STACK SEGMENT …… STACK ENDS DATA SEGMENT …… DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
简化段定义框架
.MODEL SMALL .386 .STACK ;堆栈段 .DATA ……
可以用数据定义伪指令定义一个表(数组) 或一个字符串
POWER1 DB 1,4,8,19,27,46,23 POWER2 DB 0,0,0,0,0,0,0,0,0,0 POWER3 DB ‘How are you ?’ ;每个字符占一个字节,存其ASCII码
变量和数据都具有段和偏移属性,同时也隐 含着类型属性。 如:
汇编语言的数据
常量
整数: 二进制数:01100100B 数字 0、1 十进制数:64或64D 数字 0~9 八进制数:376Q或376O 数字 0~7 十六进制数:8FFFH、0C800H 数字0~9、A~F、a~f 字符与字符串常数: ‘A’ 值41H 一个字节 ‘1234’ 值31323334H 四个字节 符号常量: 常量名 EQU 表达式 X EQU 100
功能:执行OUT指令时,(AL)该端口中 执行结果:
当PORT端口号为偶数时,输入端口与输出端口是同一个 当PORT端口号为奇数时,输入端口比输出端口大1
关系运算符
EQ(等于)、NE(不等于)、LT(小于)、 GT(大于)、LE(小于等于)、GE(大于等于)
计算结果为逻辑值:
关系成立, 结果为真,值为1 关系不成立,结果为假,值为0 例:
等号伪指令(=)
最主要的区别 用EQU定义的符号,在一个程序中不能再定义 “=”伪指令可以重定义 例: EMP EQU 6 EMP=6 “=”伪操作中可以多次定义: 如: ….. EMP=6 ….. EMP=EMP+1 ….. 说明:在EQU或“=”右边表达式中如果有变量或 标号的话,则在该语句前应该给出它们的定义。
标号:在代码段中定义,后跟冒号:
(这是标号和变量的重要区别) 标号经常出现在转移指令或CALL指令的操作数项,用 以表示转移地址。 标号有三种属性 段属性
定义标号的段起始地址,此值必须在一个段寄存器中,而标 号的段则总是在CS寄存器中。
偏移属性
标号的偏移地址是16位无符号数,它代表从段起始地址开始 到定义标号的位置之间的字节数。
不同
逻辑运算符
AND OR XOR NOT SHL SHR 注意: 是运算符,不是操作码。 逻辑运算符是按位操作的。运算在汇编过程完成 只能用于数字表达式中。
例:IN AL,PORT ; 这是外设端口地址的符号名 OUT PORT AND 0FEH, AL
;此逻辑运算在汇编时完成,结果是某一端口号
格式:
[变量名] 助记符 [操作数 ] [; 注释]
用符号地址表示,注意后 边不跟冒号
一个或多个,多个参 数之间逗号分隔
用来对伪指令进行说明
助记符
助记符
DB DW DD DQ
数据类型
字节 字 双字 四字
字节个数
1 2 4 8Leabharlann Baidu
DF DT
六字节 十字节
6 10
注意:存储顺序均为
低位在前(低地址处) 高位在后(高地址处)
变量 标识符
最多由31个字母、数字及规定的特殊字符 (?@ _ $)等组成,不能用数字开头。
定义原则:
不能以数字开头 不能单独使用特殊字符 不能使用系统的保留字,如指令名、寄存 器名和伪指令名等。 例:FFFFH 是标识符 0FFFFH 是十六进制数
变量定义及存储器分配伪指令
为数据项分配存储空间
简化段定义
宏汇编语言中包括三类语句:
机器指令语句:
汇编后形成机器代码,在执行时引起机器操作
伪指令语句:
不形成机器代码,只在汇编过程中起作用
宏指令语句:
汇编语言语句格式 指令的格式:
[标号:] 操作码项 [操作数项] [;注释项]
伪指令格式:
[变量名] 伪指令助记符 [操作数项] [;注释项]
例:
LENGTH 回送单元数
格式: LENGTH 变量
注意:
只对内存变量符号名有效,不能对标号操作 当变量中使用DUP情况,汇编程序将回送分配给该变量的单元数 而对于其它情况则回送值1 FEES DW 1,2,3,4,5….;100个数 MOV CX,LENGTH FEES 汇编后:MOV CX,1 例: FEES DW 100 DUP(0) MOV CX,LENGTH FEES 汇编后:MOV CX,100 例:
ASSUME CS:CODE,DS:DATA,SS:STACK 1000:0000
数据
堆栈 2000:FFFF 1000:FFFF 2000:0000
代码
3000:0000
3000:FFFF
START:MOV AX,DATA MOV DS,AX DS=1000H MOV AX, STACK MOV SS, AX SS=2000H …… MOV AX,4C00H INT 21H CODE ENDS END START