计算机组成原理与汇编的关系,汇编语言运算符-计算机组成原理与汇编语言-电子发烧友网站...

1.定义数据伪指令

该类伪指令用来定义存贮空间及其所存数据的长度。

DB——定义字节,即每个数据是1个字节。

DW——定义字,即每个数据占1个字(2个字节)。

DD——定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址。

DQ——定义4字长,即每个数据占4个字。

DT——定义10个字节长,用于压缩式十进制数,

例如:

DATA1DB5,6,8,100表示从DATA1单元开始,连续存放5,6,8,100,共占4个字节地址。

DATA2 DW 7,287

表示从DATA2单元开始,连续存放7,287两个字,共占4个字节地址。定义一个存贮区时,也可以不放数据,如:

TABLE DB?

表示在TABLE单元中存放的内容是随机的。当一个定义的存贮区内的每个单元要放置同样的数据时,可用DUP操作符,

如:

BUFFER DB 100DUP(0)

表示以BUFFER为首地址的100个字节中存放00H数据。

2. 符号定义伪指令EQU

EQU伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替,

如:

TIMES EQU 50

DATA DB TIMESDUP(?)

上述两个语句实际等效于如下一条语句:DATA DB 50DUP(?)

3. 包含伪指令INCLUDE

包含伪指令INCLUDE用来在程序中指明包含另一个程序。如果在用户所编写的程序中,某些地方需要这种转换程序,在该处写一条伪指令:

INCLUDE B:CONVERT.LIB

即可。汇编程序在汇编时,一旦遇到该指令,就在B盘上寻找CONVERT.LIB程序,找到后就将这个程序包含在用户程序中。

4. 段定义伪指令SEGMENT和ENDS

一般来说,一个完整的汇编源程序由3个段组成,即堆栈段、数据段和代码段。段定义伪指令可将源程序划分成若干 段,以便生成目的代码和连接时将各同名段进行组合。

段定义伪指令一般格式为

段名SEGMENT[定位类型][组合类型][类别]

 … 段名 ENDS

SEGMENT和ENDS应成对使用,缺一不可。

伪指令各部分书写规定如下:

①段名:段名是不可省略的。其他是可选项,是赋予段名的属性,可以省略。段名是给定义的段所起的名称,

例如:

STACK SEGMENT STACK

DW 20DUP(?)

STACK ENDS

②定位类型:定位类型表示该段起始地址位于何处,它可以是字节型的(BYTE),即段起始地址可位于任何地方;可以是字型(WORD)的,段起始地址必须

位于偶地址,即地址最后一位是0(二进制的);也可以是节型(PARA)的,即段起始地址必须能被16除尽;也可以是页型的(PAGE),即段起始

地址可被256除尽(一页为256个字节);也可以缺省。缺省时,段起始地址便定位为PARA型的。

③组合类型:组合类型用于告诉连接程序,该段和其他段的组合关系。连接程序可以将不同模块的同名段进行组合。根据组合类型,可将各段连接在一起,

或重叠在一起,

组合类型有:

NONE——表明本段与其他段逻辑上不发生关系,当组合类型项省略时,便指定为这一组合类型。

PUBLIC——表明该段与其他模块中用PUBLIC说明的同名段连接成一个逻辑段,运行时装入同一个物理段中,使用同一个段地址。

STACK——每个程序模块中,必须有一个堆栈段。

COMMON——表明该段与其他模块中由COMMON说明的所有同名段连接时,被重叠放在一起,其长度是同名段中最长者的长度。

MEMORY——由MEMORY说明的段。在连接时,它被放在所装载程序的最后存贮区(最高地址)。

④类别:是用单引号括起来的字符串,以表明该段的类别,如代码段(CODE)、数据段(DATA),堆栈段(STACK)等。

例如有两个模块: ;

模块1

STACK SEGMENT STACK

DW 200DUP(?)

STACK ENDS

DATA SEGMENT COMMON

 …DATA ENDS

CODE SEGMENT PUBLIC

…CODE ENDS

模块2

STACK SEGMENT STACK

DW 30DUP(?)

STACK ENDS

DATA SEGMENT COMMON

 …DATA ENDS

CODE SEGMENT PUBLIC

…CODE ENDS

END

0c2fc06d3ad415bf01a5b12e518b62af.png

5. 设定段寄存器伪指令ASSUME

ASSUME——段寄存器定义伪指令。它可通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码,

其格式为:

ASSUME段寄存器:段名[,段寄存器:段名,……]

例如:

CODE SEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACK

MOV AX,DATA

MOV DS,AX

 …CODE ENDS

6.定义过程的伪指令PROC和ENDP

在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序)。它可以被别的程序调用(用CALL指令)或由JMP指令转移到此执行;也可以由程序

顺序执行;也可以作为中断处理程序,在中断响应后转此执行。一个过程由伪指令PROC和ENDP来定义,

其格式为

过程名 PROC[类型]

 … 过程体

RET

过程名 ENDP

例如 :一个延时100ms的子程序,其过程可定义如下:

SOFTDLY PROC

MOV BL,10

;内环延时10ms

DELAY: MOV CX,2801

WAIT: LOOP WAIT

DEC BL

JNZ DELAY

RET

SOFTDLY ENDP

为了不破坏主程序的工作状态,通常在过程中应保护该过程所用到的通用寄存器的内容。考虑到这种情况过程应改成:

SOFTDLY PROC

PUSH BX

PUSH CX

MOV BL,10

;内环延时10ms

DELAY:MOV CX,2801

WAIT: LOOP WAIT

DEC BL

JNZ DELAY

POP CX

POP BX

RET

SOFTDLY ENDP

远过程调用时被调用过程必定不在本段内。

例如,有两个程序段,

其结构如下:

CODE1 SEGMENT

ASSUME CS:CODE1

 … FARPROC RPOC FAR

… RET

 … FARPROC ENDP

CODE1 ENDSCODE2 SEGMENT

ASSUME CS:CODE2

 … CALL FARPROC

 … CALL NEARPROC

 … NEARPROC PROC NEAR

 … RET

NEARPROC ENDP

CODE2 ENDS

7. 模块间通信的伪指令PUBLIC,EXTRN

PUBLIC和EXTRN伪指令可完成此功能,其一般格式为

PUBLIC 名称[,名称,……]

EXTRN 名称:类型[,名称:类型……]

例如:

目的模块1

EXTRN VAR1:WORD,OUTPUT:FAR

EXTRN VAR2:WORD

LOCAL –DATA SEGMENT

…LOCAL –DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:LOCAL --DATA

START: MOV AX,LOCAL --DATA

MOV DS,AX;初始化DS… MOV AX,SE :GVAR1

MOV ES,AX;初始化ES

ADD BX,ES:VAR1

 … MOV AX,SEGVAR2

MOV ES,AX

SUB ES:VAR2,50

… JMP OUTPUT;段间跳转

 …CODE ENDS

END START;目的模块2

PUBLIC VAR1

EXTDATA1 SEGMENT ;定义EXTDATA1数据段

 …VAR1: DW? ;定义变量VAR1

EXTDATA1 ENDS

 … END

目的模块3

PUBLIC VAR2

EXTDATA2 SEGMENT ;定义EXTDATA2数据段

 … VAR2: DW?

 … EXTDATA2 ENDS

END

PUBLIC OUTPUT

ROUTINE SEGNENTASSUME CS:ROUTINE

 …OUTPUT LABEL FAR ;定义OUTPUT标号

 …ROUTIN EENDS

END

8. 条件伪指令

汇编语言提供了一组条件伪操作,用来指示汇编程序应该测试的条件,使汇编程序能根据测试结果有选择 地对源程序中的语句进行汇编处理。

所有条件伪操作都采用如下格式:

IF××××[〈表达式〉]

 … ELSE

 … ENDIF

9.宏命令伪指令

在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏命令来代替,而汇编程序汇编到该宏命令时,

仍会产生源程序所需的代码。

例如:

MOV CL,4

SAL AL,CL

若该两条指令在程序中要多次使用,就可以用一条宏命令来代替。当然在使用宏命令前首先要对宏命令进行定义,

例如:

SHIFT MACRO

MOV CL,4

SAL AL,CL

ENDM

这样定义以后,凡是要使AL中内容左移4位的操作都可用一条宏命令SHIFT来代替。

宏命令的一般格式为宏

命令名MACRO[形式参量表]…宏体

ENDMMACRO是宏定义符,是和ENDM宏定义结束符成对出现的。这两者之间就是宏体,也就是该宏命令要代替的那一段程序,

例如:

GADD MACRO X,Y,ADD

MOV AX,Y

ADD AX,Y

MO VADD,AX

ENDM

其中X,Y,ADD都是形式参量。调用时,下面宏命令书写格式是正确的:

GADD DATA1,DATA2,SUM

这里DATA1,DATA2,SUM是实参量。实际上与该宏命令对应的源程序为:

MOV AX,DATA1

ADD AX,DATA2

MOV SUM,AX

10.汇编结束伪指令END

该伪指令表示源程序的结束,令汇编程序停止汇编。因此,任何一个完整的源程序均应有END指令,

其一般格式为

END[表达式]

其中表达式表示该汇编程序的启动地址。

例如:

 … END START

则表明该程序的启动地址为START。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值