Assembly 使用masm编译器初始化汇编8086中的数据段寄存器
以下两条语句用于初始化数据段寄存器Assembly 使用masm编译器初始化汇编8086中的数据段寄存器,assembly,loader,x86-16,segment,Assembly,Loader,X86 16,Segment,以下两条语句用于初始化数据段寄存器 mov AX, @Data mov DS, AX 但是,只有当加载器将程序加载到内存中时,才知道实际的数据段地址。 -汇编程序用什么来代替@data? -当加载程序获得实际数据段基址时,它是否将指令mov AX、@data替换为mov AX、实际基址? -在加载阶段之前,如果实际基址未知,为什么有必要编写此语句?每次编写类似于mov AX、@Data的指令时,编译器/汇编程序都会在程序中插入3个字节: 第一个字节是操作码,如果是AX,则
mov AX, @Data
mov DS, AX
但是,只有当加载器将程序加载到内存中时,才知道实际的数据段地址。-汇编程序用什么来代替@data?
-当加载程序获得实际数据段基址时,它是否将指令mov AX、@data替换为mov AX、实际基址?
-在加载阶段之前,如果实际基址未知,为什么有必要编写此语句?每次编写类似于
mov AX、@Data
的指令时,编译器/汇编程序都会在程序中插入3个字节:
- 第一个字节是操作码,如果是AX,则为0B8h
- 第2和第3个字节一起表示一个数字李>
- 汇编程序用什么来代替@data
- 当加载器获得实际数据段基址时,它是否将指令mov AX、@data替换为mov AX、实际基址
- 在加载阶段之前,实际基址未知,为什么有必要编写此语句
在您编写这些指令的任何地方(可能有很多),您都会为DOS提供占位符,DOS加载程序可以在占位符中插入正确的地址。汇编程序可能会注意到,
mov AX、@Data
需要修正。我相信链接器将用相对于可执行文件开头的段填充@Data,并通过DOS加载程序将其标记为fixup(可执行文件的头中有一个fixup表)。当您运行程序时,DOS程序加载器将从可执行文件中读取DOS头,并添加DOS物理加载程序的段,该段由链接器放在指令中。这将为@Data
生成一个运行时值。之所以这样做,是因为DOS程序可以加载到不同位置的内存中。因此,必须提供这些修复。如果不在代码中执行mov AX、@Datamov DS,AX
,程序本身在运行时不会知道DS(数据段)。如果不设置DS,您可能无法在内存中读取和写入变量,而您的程序也无法按预期工作。