日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解ORG指令

發布時間:2024/9/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解ORG指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《自己動手寫操作系統》書中第二頁的代碼1-1中對于 org<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />07c00h是這樣注釋的:告訴編譯器程序加載到7c00h”<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

org 07c00h

?

mov ax,cs

mov ds,ax

mov es,ax

?

call screen

jmp $

?

screen:mov ax,bootmsg

mov bp,ax

mov cx,16

mov ax,01301h

mov bx,000ch

mov dl,0

int 10h

ret

?

bootmsg:db'Hello OS world!'?

times 510-($-$$) db 0?

dw 0xaa55

?

?

但是我看到一些資料說,bios會自動將引導程序加載到07c00h處,也就是說無論代碼是什么都會被bios加載到07c00h處,那么為什么還要寫呢?后來我去掉org 7c00h試了一下,仍可以啟動。只是顯示亂碼。?

?

org 會在編譯期影響到內存尋址指令的編譯(編譯器會把所有程序用到的段內偏移地址自動加上org 后跟的數值),而其自身并不會被編譯成機器碼。就是為程序中所有的引用地址(需要計算的相對地址)增加一個段內偏移值。org 指令本身并不能決定程序將要加載到內存的什么位置,它只是告訴編譯器,我的程序在編譯好后需要加載到xxx 地址,所以請你在編譯時幫我調整好數據訪問時的地址。

?

如果沒有org指令,那么編譯器計算偏移量(雖然nasm中沒有offset但編譯器仍會進行這個運算)是從0000開始的,如果有了org,就會在最后加上org后面跟的數字。

?

在這個引導程序中:mov ax,bootmsg 在編譯的時候實際上是將 mov ax,bootmsg所在的地址與bootmsg同當前語句(mov ax,bootmsg)地址的偏移量相加所計算出來的。沒有org則偏移量從0000h開始,于是雖然整個代碼被加載到0x7c00處,但當執行到mov ax,bootmsg一句的時候,由于沒有算入偏移量7c00從而沒有將bootmsg字符串的首地址放入ax,以至發生錯誤。

?

?

Ndisasm -o 0x0000 boot.bin >> disboot1.asm 所得到的匯編文件:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

Ndisasm –o 0x7c00 boot.bin >> disboot2.asm所得到的匯編文件:

?

?

通過反匯編,模擬了引導程序被加載到00000000處和00007c00處時的不同情形。第一次為00000000第二次為 00007C00。而對于mov ax,bootmsg一句的翻譯卻是一樣的,都是 mov ax,0x7c1e 。顯然第一次發生了錯誤(因為在整個程序中就沒有出現0x7c1e這個地址,也就是說這是個無效地址)。錯誤產生的原因就是由于當代碼被編譯器編譯的時候編譯器是按照從7c00處開始計算地址的。也證明了bootmsg的地址是由編譯器計算出來的。

?

最后我們來分析一下為什么有時候去掉org 指令程序也能正常執行?

如:

ORG?? 7C00H??

msg:? db 'HELLO?? WORLD',0

MOV?? DX, OFFSET?? msg??

?

在有ORG?? 7C00H的情況下,MOV?? DX,?? OFFSET?? msg對應的指令為MOV?? DX,7C4B(這里4Bmsg在當前數據段中的偏移位置)如果沒有ORG?? 7C00H,那么真正被執行的指令將為MOV?? SI,004B,試想,BIOS已經將該代碼裝載到0000:7C00處,0000:00000000:7C00之間的數據可能為其他更重要的數據,如果使用004B就得不到我們所要訪問字符串msg,因為我們的字符串被BIOS放在7C4B這里了,所以我們的程序(最終由編譯器來完成)就必須迎合BIOS的這種規定了。

?

因此,如果在程序中沒有牽扯到地址的計算,那么完全可以不寫org(沒有做實驗驗證) ? ? 以下是我參考的文章,給了我很大的幫助。可以從我的blog資源中下載 http://blogimg.chinaunix.net/blog/upfile/070306125420.pdf

轉載于:https://blog.51cto.com/rickcheung/268266

總結

以上是生活随笔為你收集整理的理解ORG指令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。