发表于 2019-10-1 18:17:19

汇编语言 - 第6章 包含多个段的程序

本帖最后由 SВ 于 2019-10-9 15:46 编辑

没有什么难点,主要是再次提到assume的用法。

ASSUME directive

assume伪指令有几种用法,下面是最主要用法

应用于数据段

使用assume声明指出这个数据段中的所有变量内存寻址时引用的段寄存器,然后遇到一个变量时(这个变量在这个数据段中定义),就是依据这个声明来生成包含这些变量的指令的二进制机器码中的段寄存器部分的数据。

一般情况下,指令根据指令类型有默认的段寄存器来保存变量所在段的段地址,参考:操作数寻址 -> 默认段寄存器,如使用默认段寄存器DS,则assume声明可以省略。
由于MS-DOS加载可执行文件时,DS和ES寄存器指向程序段前缀PSP,所以必须重新初始化段寄存器DS,使它指向变量所在段的段地址。
assume声明等效于段超越前缀(MASM50-PROGGUIDE 5.4节的例子 )

经实验
1.assume声明的作用域从它声明处开始到源程序结束的所有全局范围(而段超越前缀的只作用于使用它的那条指令),除非有新的assume声明或者段超越前缀出现

2.assume声明在改变默认段寄存器情况下会在指令前产生前缀字节,比如assume es:segment name 产生前缀26,表示改变下一条指令的段寄存器为ES段寄存器

其他段待验证
页: [1]
查看完整版本: 汇编语言 - 第6章 包含多个段的程序