ORG伪指令的作用是什么?

JerKii 2005-11-16 04:03:51
对于COM文件,我们通常会在程序中添加ORG 100H的指令,如果不加的话,使用ML /AT ...就会产生警告!

对于一些特殊的程序,如引导程序,在程序中就会有ORG 7C00H,我想知道这些指令究竟有什么用?似乎在最终生成的二进制文件也看不出任何变化啊?
...全文
1608 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
phoebuslv 2010-06-04
  • 打赏
  • 举报
回复
不错额
minico 2005-11-18
  • 打赏
  • 举报
回复
“所以我们的程序(最终由编译器来完成)就必须迎合BIOS的这种规定了。”
=======================================
我觉得应该是连接器生成的,也就是最后的地址调整是连接器完成的。
DragonBill 2005-11-17
  • 打赏
  • 举报
回复
分啊分啊
大熊猫侯佩 2005-11-16
  • 打赏
  • 举报
回复
^.^
JerKii 2005-11-16
  • 打赏
  • 举报
回复 1
哎,自己琢磨了一下,终于弄清楚了,唉!白费了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的这种规定了。

21,460

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧