费解了好久,一直不明白org是干嘛的。首先平时编程绝对不加org也能运行,为什么写引导区就要加上呢。其次,很多文章对此的解释是,org 07c00h会把程序加载到内存地址07c00(0000::7c00)处,但是它真能决定程序加载位置吗?
先说第二个问题,在BIOS自检等一系列工作完成后,要开始引导了。计算机会将硬盘0面0道1扇区512字节加载到07c00h(0000::7c00)处。不管有没有org,都会加载到07c00处。org根本对程序加载位置没有任何影响,它只是伪指令,只在汇编器汇编阶段起作用,之后不翻译成机器指令。那既然程序已经加载到了07c00h处,为什么需要org??因为org是对汇编器的指示性语句。
我们假设程序代码如下(这程序过于简陋,只是为了示例!):
code segment
start:mov ax,offset msg
msg db "hello"
code ends
end start
如果程序这么写的话,那么汇编器默认在汇编时将mov ax,offset msg汇编成mov ax,0003h(这条语句3字节长,那么msg在段内偏移就是0003h了)。正常情况下,系统把这个程序会自动加载到自由内存区,并且是加载到某一段的0000h偏移处。比如在我的电脑上debug可以看到