Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用masm编译器初始化汇编8086中的数据段寄存器_Assembly_Loader_X86 16_Segment - Fatal编程技术网

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
此数字表示可执行文件(加载到内存中时)开始与数据段开始之间的距离。该数字以16字节的段落或块表示

  • 当加载器获得实际数据段基址时,它是否将指令mov AX、@data替换为mov AX、实际基址
加载程序仅更新第2和第3个字节。它从不触及第一个字节

  • 在加载阶段之前,实际基址未知,为什么有必要编写此语句

在您编写这些指令的任何地方(可能有很多),您都会为DOS提供占位符,DOS加载程序可以在占位符中插入正确的地址。

汇编程序可能会注意到,
mov AX、@Data
需要修正。我相信链接器将用相对于可执行文件开头的段填充@Data,并通过DOS加载程序将其标记为fixup(可执行文件的头中有一个fixup表)。当您运行程序时,DOS程序加载器将从可执行文件中读取DOS头,并添加DOS物理加载程序的段,该段由链接器放在指令中。这将为
@Data
生成一个运行时值。之所以这样做,是因为DOS程序可以加载到不同位置的内存中。因此,必须提供这些修复。如果不在代码中执行mov AX、@Data
mov DS,AX
,程序本身在运行时不会知道DS(数据段)。如果不设置DS,您可能无法在内存中读取和写入变量,而您的程序也无法按预期工作。