8086汇编基础学习(3)——伪指令
什么是伪指令:
定义:
伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有对应机器代码,只用于汇编过程中为汇编程序提供汇编信息。
特点:
“伪”,假指令,是不可以执行的指令,没有对应的机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息
“指令”,只存在于汇编语言中,高级语言中不叫指令,叫语句
区别:
指令是在执行阶段发挥作用的,由CPU来执行
伪指令是在编译阶段发挥作用的,由汇编器来解释
数据定义类伪指令:
为源程序中的数据和堆栈分配存储单元是,使用的伪指令
格式:
[ <变量名> ] <类型><初值表>
数据类型:
DB(定义字节)一个字节数据占用1个字节的存储单元,读操作时,偏移量加1
DW(定义字)一个字数据占用2个字节的存储单元,读操作时,偏移量加2
DD(定义双字)一个双字数据占用4个字节的存储单元,读操作时,偏移量加4
DQ(定义四字)一个四字数据占用8个字节的存储单元,读操作时,偏移量加8
DT(定义十字)常用于BCD码
初值:
可以是常数、表达式、字符串
符号定义类伪指令:
符号定义伪指令是给一个数值、字符串或表达式赋予一个名字。符号定义伪指令有等值伪指令EQU、等号伪指令 “=”、符号 / 标号伪指令LABEL三种,其实是给内存地址一个标号
1. EQU(等值伪指令)
- 格式:<符号名> EQU <表达式>
2. "=" 伪指令
- 格式:<符号名> = <表达式>
- 区别:
- EQU伪指令定义的符号在一个源程序中是不能被重复定义的
- ”=“伪指令定义的符号可以被重复定义,但是后定义的符号变量会覆盖前者的定义
- 使用EQU伪指令定义的符号名不仅可以代表某个常数或常数表达式,还可以代表字符串、关键字、指令码、一串符号(如WORD PTR)等,而使用等号伪指令定义的符号名仅用于代表数值表达式。
3. LABEL伪指令
- 描述:符号定义伪指令和THIS运算符(关于表达式中的运算发的讲解在之后)功能类似,可以为当前存储单元定义一个指定类型的变量或标号。
- 格式:<符号名> LABEL <表达式>,其中,数据类型就是常用的数据类型:BYTE、WORD、DWORD、结构类型、记录类型(这五类符号名就是变量名)、NEAR、FAR(这两类符号名就是标号名)等。
段和过程定义伪指令:
段和过程定义伪指令用来定义代码段、数据段、堆栈段和子程序。
1.段定义伪指令
- 描述:为了与存储器的分段结构相对应,汇编语言源程序也是用分段的方法来组织程序代码、数据和变量的。段定义伪指令SEGMENT/ENDS用于段的定义
- 格式:
-
- 段名:给段起的名字,这是必须的属性,定位类型,组合类型,’类别‘是可选属性,初学时最好默认!!
- 定位类型:确定逻辑段的起始地址:BYTE, WORD, PARA, FAGE, 默认是PARA(节),低四位地址为0
- 组合类型:说明逻辑段装入内存时如何和其他段进行组合,有NONE, PUBLIC, STACK, COMMON, MEMORY, AT六种:
- NONE,为默认值,表示本段和其他段不发生关系,具有独立的段地址
- PUBLIC:将同名同类型的段相邻地连接到一起,具有共同的段地址。
- STACK:和PUBLIC功能一样,但用于堆栈段,定义堆栈段必须有。
- COMMON:所有同名同类型段具有相同段地址,但后面的会覆盖前面的,用于共享数据。
- MEMORY:将本段定义在其他段之后。
- AT :将本段定义在表达式指定位置,但代码段不能用。
- 类别:用户自定义的类别名,用单引号括起来,如'STACK','CODE','DATA'。连接程序会把类别名相同的所有段装入内存的连续区域。