第四章伪指令 联系客服

发布时间 : 星期五 文章第四章伪指令更新完毕开始阅读76be24d533d4b14e8524683b

存器的设置。

语句格式:ASSUME 段寄存器名:段名,[段寄存器名:段名,······] 功能:指定段寄存器与段之间的关系。 说明:段寄存器名是指四个段寄存器CS、SS、DS、ES中的一个,段名是指用SEGMENT和ENDS伪指令语句中定义的段名。段寄存器名与段名之间必须使用冒号作为分隔符,表示该段寄存器被该段名所占用。ASSUME指定的各个匹配项之间(段寄存器名:段名)使用逗号作为分隔符。

ASSUME伪指令中的段名还可以使用一种特殊的关键字NOTHING,它表示某个段寄存器不再与任何段有对应关系。

例如:ASSUME DS:DSEG,ES:NOTHING ,该伪指令的含义是ES寄存器不对应任何段。

4.6 程序开始与结束伪指令 4.6.1 程序开始伪指令

1. NAME 伪指令 格式:NAME 模块名 功能:汇编程序将对给定的程序模块取模块名。其中,模块名的第一个字符必须为字母、下划线或点。例如:

NAME INPUT NAME .OUTPUT NAME _1234

均为合法的NAME语句。

在使用NAME命名模块名时,要注意一个汇编源程序中只能出现一条NAME语句,并且该NAME一般出现在程序的最开始位置。

2. TITLE 伪指令 格式:TITLE 正文

功能:该伪指令可在每一页上打印标题。如果程序中没有NAME 伪指令时,则汇编程序将取正文中的前六个字符作为模块名。NAME和TITLE伪指令并不是必要的,若两者都没有指定,则将用源文件名作为模块名。

其中,正文可以为任意字符打头,同时一个汇编源程序中只能出现一条TITLE语句,并且该TITLE一般出现在程序的最开始位置。例如:

TITLE ADD TITLE SUB TITLE 111

均位合法的TITLE语句。 3. SUBTTL伪指令 格式:SUBTTL 正文

功能:该伪指令为程序指定一个小标题,并打印在每一页的标题之后。

其中,正文可以为任意字符打头,同时一个汇编源程序中允许出现多条SUBTTL语句,并且该SUBTTL可以出现在程序的任意位置。

4.6.2 程序结束伪指令END

格式:END [标号]

功能:伪指令END是源程序结束的标志,它告诉汇编程序,汇编工作到此为止。标号指出程序开始执行的起始地址。若多个程序模块相连接,则只有主程序模块的结束位置要在END语句后加标号,指出主程序的入口地址(从该标号开始),其他程序模块只用END而不给出标号。

4.6.3 定位伪指令(ORG)

语句格式:ORG 表达式 功能:定位伪指令ORG的作用是指示汇编程序将ORG语句的以下程序段按照ORG给出的地址开始存储。

注意:ORG语句后的指令或数据从表达式给定的值作起始偏移量。其中表达式是以65536为模进行计算的,且一定为正数。表达式中可以包含当前位置计数器$。

例4-17 请观察以下程序,掌握ORG的用法。 DSEG SEGMENT ORG 0005H

VAR1 DB \,0AH,”$” ORG 0010H

DB \DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG START:

MOV AX,DSEG MOV DS,AX

MOV DX,OFFSET VAR1 MOV AH,09H INT 21H

MOV AH,4CH INT 21H CSEG ENDS END START

对于该程序,我们要分析的是在数据段中出现的ORG 0005H和ORG 0010H语句。 对于ORG 0005H语句的功能是将\,0DH,0AH,”$”这一系列字符从DS:0005H单元开始依次存储到存储器中,以上的数据要占据20个字节单元,所以它们要从DS:0005H单元开始一直存储到DS:0018H单元。

对于ORG 0010H语句的功能是将\这一系列字符从DS:0010H单元开始依次存储到存储器中,这些数据要从DS:0010H单元开始一直存储到DS:0025H单元。

由以上分析可知,这两组数据所占用的DS:0010H~DS:0018H存储区域存在了冲突。汇编时,汇编程序根据ORG语句出现的先后次序,把ORG 0010H语句后的数据信息从DS:

0010H单元开始存放,覆盖掉第一条ORG 0005H语句中从“!”开始的后续数据。其存储过程如图4-18所示。

图4-18 存储示意图

由图4-18可知,该程序被执行后,在屏幕上将被显示的数据应该是“HOW ARE YOU I AM FINE!THANK YOU”。然后再显示回车符(0DH)和换行符(0AH),直到遇到显示结束符(“$”)则停止显示。

注意:在程序段中往往不宜使用ORG命令,因为这样会使程序产生混乱。除非用户有特殊要求。

例4-18 程序段中ORG的应用。 DSEG SEGMENT VAR1 DW 1234H VAR2 DW 5678H VAR3 DW ? DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG ,DS:DSEG START:

MOV AX,DSEG MOV DS,AX MOV CX,0020H

JMP CX ;IP←0020H ORG 0020H MOV AX,VAR1 ADD AX,VAR2

MOV CX,0040H ;IP←0040H JMP CX

ORG 0040H MOV VAR3,AX MOV AH,4CH INT 21H CSEG ENDS END START

如果在代码段中使用了ORG语句,则需要使用无条件转移指令将各个存储区中的代码进行连接,使CPU只执行本程序的指令。

4.6.4 当前位置计数器($)

在汇编程序时,为了指示下一个数据或指令在相应段中的偏移量,汇编程序使用一个当前位置计数器,汇编程序使用一个当前位置计数器,用于记载汇编时的当前偏移量。符号“$”就是代表当前位置计数器的值。

符号“$”一般有以下2种用法:

(1)符号“$”在指令中使用时,代表本指令的第一字节。例如: JMP $

该指令功能为无条件转移到该转移指令的第一字节,其等价于HERE:JMP HERE指令。 (2)符号“$”用在定义数据的伪指令时,又有两种情况:

①如果符号“$”出现在DW伪指令中,则符号“$”表示当前单元的偏移量。 设数据段定义如下: DSEG SEGMENT

BLOCK1 DW 1234H,5678H,$,$ DSEG ENDS

假设BLOCK1从DS:0000H单元开始存储,则第一个$代表的是0004H,第二个$代表的是0006H。其存储示意图如图4-19所示。

图4-19 存储示意图

②如果符号“$”出现在DD伪指令中,则符号“$”表示当前单元的逻辑地址。其中偏移量存放在低字单元中,段首址存放在高字单元中。

例4-19 设数据段定义如下: DSEG SEGMENT

BLOCK1 DD 1234H,$,$ DSEG ENDS