ORG伪指令的作用是什么?

来源:百度文库 编辑:神马文学网 时间:2024/04/29 09:38:50

ORG伪指令的作用是什么?

JerKii (JERKII SHANG)     2005-11-16 16:03:51 在 其他开发语言 / 汇编语言 提问
对于COM文件,我们通常会在程序中添加ORG   100H的指令,如果不加的话,使用ML   /AT   ...就会产生警告!  
   
  对于一些特殊的程序,如引导程序,在程序中就会有ORG   7C00H,我想知道这些指令究竟有什么用?似乎在最终生成的二进制文件也看不出任何变化啊?  
 
问题点数:20、回复次数:4 1楼  JerKii   (JERKII SHANG)  回复于 2005-11-16 16:48:20  得分 0 =========================================================================================================
哎,自己琢磨了一下,终于弄清楚了,唉!白费了20啊!:(  
  下面是我的总结:  
   
  简单说来,该指令用来修正该指令以后出现的(变量/标志的)内存地址,也就是说如果有ORG   0x12345h,那么在该指令以后的变量的地址将被修正为0x12345+old_addr。  
   
  对于DOS中的COM文件,在被DOS装载进内存后,系统会在内存的CS:0000   –   CS:0100区域创建一个PSP,这里存放了一些系统所需的信息,比如通过命令行所传递的参数等,COM文件的代码将被装载到CS:0100   –   CS:XXXX的内存区域,所以说如果COM代码中不通过使用ORG   100h来进行修正的话,该段中的变量将不能被正确访问,这时,对改变量的访问将导致PSP中的数据被访问了,从而得不到预期的结果。对于EXE文件,其所采用的方式可能就不一样了,具体是怎样的,目前还不知道。。。  
   
  对于一些引导程序,这些程序将被BIOS装载到内存中的指定地方,通常为0000:7C00,这跟DOS装载COM文件的机制是一样的,只不过DOS是将COM文件的代码装载到CS:0100处。所以在,引导程序的汇编代码中,需要指定ORG   7C00H来对代码中的变量的内存地址进行修正。  
  如:  
              ORG   7C00H  
   
  msg     db   ‘HELLO   WORLD’,0  
   
              MOV   DX,   OFFSET   msg  
  在有ORG   7C00H的情况下,MOV   DX,   OFFSET   msg对应的指令为MOV   DX,7C4B(这里4B为msg在当前数据段中的偏移位置)如果没有ORG   7C00H,那么真正被执行的指令将为MOV   SI,004B,试想,BIOS已经将该代码装载到0000:7C00处,0000:0000   –   0000:7C00之间的数据可能为其他更重要的数据,如果使用004B就得不到我们所要访问字符串msg,因为我们的字符串被BIOS放在7C4B这里了,所以我们的程序(最终由编译器来完成)就必须迎合BIOS的这种规定了。  
 
====================== 这样说来,.COM文件的执行还是要DOS操作系统之下才行啊?至少加载时是这样的,那么也就是说.com文件并不是可以在无操作系统时执行的。 ======================不过仔细想想,如果无操作系统,也无所谓什么文件格式了。纯粹的裸机只能执行机器代码而已。