微型计算机技术
定位类型、组合类型和类别都是可以省略的选项,在开发只有一个代码段、一个数据
段、一个附加数据段以及一个堆栈段都的前提下,仅需将堆栈段的组合类型定义为
STACK,而段定义中的其它选项都可以忽略。这些选项的详细说明可参阅相关文献。
2.段使用设定语句
编译器在对汇编源程序编译的过程中需要知道逻辑段与各段寄存器之间的对应关系,
这一要求由伪指令 ASSUME 来完成,其格式如下:
assume 段寄存器名:段名 [,段寄存器名:段名]…[,段寄存器名:段名]
其中,段寄存器名可以是 CS、DS、ES 和 SS。段名是我们在源程序中已经定义的段的
名称。
伪指令 ASSUME 用来告诉编译器将要进行逻辑段和段寄存器新的绑定关系。对只有单
个数据段的简单程序来说,这种绑定只需声明一次。作为伪指令,ASSUME 只能将这种绑
定关系告诉编译器,对段寄存器的赋值还需要 8086 的数据传送指令来完成。所以,在伪指
令 ASSUME 之后,常紧接着 8086 的数据传送指令。在例 6.1 中,如下语句完成绑定声明和
实际绑定:
assume ss:stack, ds:data, cs:code ;绑定声明
mov ax, data ;实际绑定
mov ds, ax ;实际绑定
在上述代码中,只对数据段寄存器 DS 进行了绑定,而对 ASSUME 中声明的另外的代
码段寄存器 CS 和堆栈段寄存器 SS 并未进行实际绑定。这是因为,由链接程序生成的.EXE
格式的可执行文件在装入内存时,SS 和 CS 的初始化工作由 DOS 操作系统来完成。
在 8086 的指令中,虽然 mov cs, ax 也是一条 CPU 的真实指令,可这条指令并不能完成
任何动作,相反,还可能会引发系统的一个异常。段寄存器 CS 的值只能通过上一章中所提
到的无条件跳转指令 JMP、子程序调用 CALL、子程序返回 RET、中断调用 INT 和中断返
回 IRET 等指令来改变。
如果将例 6.1 中的程序改为如下:
assume ss:stack, ds:data, cs:code
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
程序仍能正常工作,但当我们了解了 DOS 对可执行程序的初始化流程之后,显然后两条指
令就显多余了。
8086 的指令集中没有直接把立即数赋值给段寄存器的指令,因此,对段寄存器的赋值
操作要通过另一个通用寄存器的“中转”来完成。这里选寄存器 AX,当然也可以选其它通用
寄存器。
例 6.2 伪指令 ASSUME 的用法。
;FILENAME: E0602.ASM
评论0
最新资源