初始化数据段使用masm编译器在程序集8086中注册

时间:2016-09-30 20:56:29

标签: assembly loader x86-16 segment

以下两个用于初始化数据段寄存器的语句

    mov AX, @Data  
    mov DS, AX

但实际数据段地址仅在加载程序将程序加载到内存中时才知道 - 汇编程序用什么代替@data?
- 当加载程序获取实际数据段基址时,是否将指令mov AX,@ data替换为mov AX,实际基址? - 为什么有必要在加载阶段之前知道实际基址时写这个语句?

1 个答案:

答案 0 :(得分:1)

每次编写像mov AX, @Data这样的指令时,编译器/汇编器会在程序中插入3个字节:

  • 第一个字节是操作码,如果AX则为0B8h
  • 第二个和第三个字节一起表示一个数字。
  
      
  • 汇编程序用什么代替@data?
  •   

此数字表示可执行文件的开头(在内存中加载时)与数据部分的开头之间的距离。这个数字用段落表示,也就是16字节的块。

  
      
  • 当加载程序获取实际数据段基地址时,是否将指令mov AX,@ data替换为mov AX,实际基址?
  •   

加载程序仅更新第2个和第3个字节。它永远不会触及第一个字节!

  
      
  • 为什么在加载阶段之前未知实际基址时需要编写此语句?
  •   

你写这些指令的所有地方(可能有很多这些指令),你为DOS提供占位符,DOS加载器可以插入正确的地址。