当前位置:课程学习>>第三章>>知识讲解>>视频课堂>>知识点二


知识点二: 汇编语言的伪指令




伪指令从表示形式及其在语句中所处的位置,与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。

进入下一个知识点的学习