当前位置:课程学习>>第三章>>知识讲解>>视频课堂>>知识点二
伪指令从表示形式及其在语句中所处的位置,与CPU指令相似,但二者有着重要的区别。
伪指令不像机器指令那样是在程序运行期间由CPU来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作;
汇编以后,每条CPU指令产生一一对应的目标代码,而伪指令则不产生与之相应的目标代码。
伪指令的相关知识讲解在以下视频中,[录人 3.3.8086汇编语言程序设计.伪指令.pptx]。
1.变量定义伪指令
变量定义伪指令用来为数据分配存储单元,建立变量与存储单元之间的联系。
语句格式为:
[变量名] 数据定义伪指令 操作数1[,操作数2…]
变量定义伪指令有:
DB、DW、DD、DQ、DT,分别用来定义类型属性为字节(DB)、字(DW)、双字(DD)、4字(DQ)、5字(DT)的变量。
变量定义伪指令的操作数可以是:
(1)数字常量,允许以十进制、八进制、十六进制、二进制等形式表示,默认形式是十进制;
(2)字符常量,用单引号括起来,被存储的是该字符的ASCII码;
(3)符号常量,必须是预先已定义的符号;
(4)符号“?”,表示预留空间,内容不定。
DUP,表示内容重复的数据。
DUP用法的具体形式为:
次数 DUP ( 被重复内容)
例如,数据定义如下,
DATA_B DB 10,'A'
DATA_W DW 1234H
DATA_S DB '1234',2 DUP(3)
上述代码在 示例代码 2.asm中。
对2.asm在存储器中分配变量的仿真执行过程,参见以下视频[录屏 \03 8086汇编语言程序设计_2.mp4]。
2.符号定义伪指令
符号包括汇编语言的变量名、标号名、过程名、寄存器名及指令助记符等。
常用符号定义伪指令有:EQU、“=”、LABEL
(1)EQU
表达式可以是一个常数、已定义的符号、数值表达式或地址表达式。给表达式赋予一个名字。定义后,可用名字代替表达式。在同一源程序中,一个名字只能用EQU定义一次。
格式:名字 EQU 表达式
例:
PIX EQU 64*1024 ;名字PIX代表数值表达式的值
A EQU 7
B EQU A-2
(2)=
与EQU基本相同,区别是它可以对同一个名字重新定义。
格式:名字 = 表达式
例:
COUNT = 10
MOV AL,COUNT
COUNT = 5
(3)LABEL
定义变量或标号的类型,而变量或标号的段属性和偏移属性由该语句所处的位置确定。
格式:变量/标号 LABEL 类型
例:
利用LABEL使同一个数据区有一个以上的类型及相关属性。
AREAW LABEL WORD
;AREAW与AREAB指向相同的数据区,
;AREAW类型为字,AREAB类型为字节
AREAB DB 100 DUP(?)
MOV AX,2011H
MOV AREAW,AX ;(AREAW)=2011H
MOV BL,AREAB ;BL=11H
3.汇编语言的语句
汇编源程序由段组成,每段大小不超过64KB,不同的段存放不同类型的数据。段定义伪指令用于汇编源程序中段的定义。
相关指令有:SEGMENT、ENDS、ASSUME。
(1)SEGMENT,ENDS
例:
DATA SEGMENT
DATA_B DB 10,'A'
DATA_W DW 1234H
DATA_S DB '1234',2 DUP(1,2 DUP(0))
DATA ENDS
在上述代码中,语句对
DATA SEGMENT
DATA ENDS
定义了一个逻辑段,段名为 DATA。
(2)ASSUME
用于明确段与段寄存器的关系。
段寄存器可以是:CS、DS、ES、SS。段名为已定义的段。
凡是程序中使用的段,都应说明它与段寄存器之间的对应关系。
格式:ASSUME 段寄存器名:段名[,段寄存器名:段名…]
ASSUME伪指令只是指示各逻辑段使用段寄存器的情况,并没有对段寄存器的内容进行赋值。DS、ES的值必须在程序段中用指令语句进行赋值,而CS、SS由系统负责设置,程序中也可对SS进行赋值,但不允许对CS赋值。
例:
ASSUME CS:CODE,DS:DATA
数据是汇编语言语句的重要组成部分。汇编语言能识别的数据有:常量、变量、标号。
4.过程定义伪指令
过程定义伪指令用于定义过程。
指令格式如下:
过程名 PROC [类型]
…
RET
过程名 ENDP
过程名按汇编语言命名规则设定,汇编及链接后,该名称表示过程程序的入口地址,供调用使用。
PROC与ENDP必须成对出现,PROC开始一个过程,ENDP结束一个过程。成对的PROC与ENDP的前面必须有相同的过程名。类型取值为:NEAR(为默认值)或FAR,表示该过程是段内调用或段间调用。一个过程中,至少有一条过程返回指令RET,一般放在ENDP之前。
5.其他伪指令
定位伪指令ORG
指定其后的程序段或数据块所存放的起始地址的偏移量。
格式:ORG 表达式
表达式取值范围为:0~65535内的无符号数。
例:
MY_DATA SEGMENT
ORG 100H
MYDAT DW 1,2,$+4
MY_DATA ENDS
例:
第2章 8086寻址方式与指令系统 示例代码 1.asm
ORG 100H
MOV AX, 2010H
RET
代码段截入存储器后,首地址为100h。
代码段CS值为0700h,所以代码 mov ax, 2010h的地址为 0700h*10h+0100h=>07100。对应的机器码为 B8 10 20。