1樓 JerKii (
JERKII SHANG)
回復于
2005-11-16 16:48:20 得分
0 =========================================================================================================
哎,自己琢磨了一下,終于弄清楚了,唉!白費了20?。。海?
下面是我的總結:
簡(jiǎn)單說(shuō)來(lái),該指令用來(lái)修正該指令以后出現的(變量/標志的)內存地址,也就是說(shuō)如果有ORG 0x12345h,那么在該指令以后的變量的地址將被修正為0x12345+old_addr。
對于DOS中的COM文件,在被DOS裝載進(jìn)內存后,系統會(huì )在內存的CS:0000 – CS:0100區域創(chuàng )建一個(gè)PSP,這里存放了一些系統所需的信息,比如通過(guò)命令行所傳遞的參數等,COM文件的代碼將被裝載到CS:0100 – CS:XXXX的內存區域,所以說(shuō)如果COM代碼中不通過(guò)使用ORG 100h來(lái)進(jìn)行修正的話(huà),該段中的變量將不能被正確訪(fǎng)問(wèn),這時(shí),對改變量的訪(fǎng)問(wèn)將導致PSP中的數據被訪(fǎng)問(wèn)了,從而得不到預期的結果。對于EXE文件,其所采用的方式可能就不一樣了,具體是怎樣的,目前還不知道。。。
對于一些引導程序,這些程序將被BIOS裝載到內存中的指定地方,通常為0000:7C00,這跟DOS裝載COM文件的機制是一樣的,只不過(guò)DOS是將COM文件的代碼裝載到CS:0100處。所以在,引導程序的匯編代碼中,需要指定ORG 7C00H來(lái)對代碼中的變量的內存地址進(jìn)行修正。
如:
ORG 7C00H
msg db ‘HELLO WORLD’,0
MOV DX, OFFSET msg
在有ORG 7C00H的情況下,MOV DX, OFFSET msg對應的指令為MOV DX,7C4B(這里4B為msg在當前數據段中的偏移位置)如果沒(méi)有ORG 7C00H,那么真正被執行的指令將為MOV SI,004B,試想,BIOS已經(jīng)將該代碼裝載到0000:7C00處,0000:0000 – 0000:7C00之間的數據可能為其他更重要的數據,如果使用004B就得不到我們所要訪(fǎng)問(wèn)字符串msg,因為我們的字符串被BIOS放在7C4B這里了,所以我們的程序(最終由編譯器來(lái)完成)就必須迎合BIOS的這種規定了。
這樣說(shuō)來(lái),.COM文件的執行還是要DOS操作系統之下才行???至少加載時(shí)是這樣的,那么也就是說(shuō).com文件并不是可以在無(wú)操作系統時(shí)執行的。
======================
不過(guò)仔細想想,如果無(wú)操作系統,也無(wú)所謂什么文件格式了。純粹的裸機只能執行機器代碼而已。