實模式下 一個彙編小程序

主要通過它來驗證彙編中的標號實際是表示段內偏移呢,還是實際的內存地址。 

原代碼:

 

 

 
nasm boot.asm -o boot.bin
執行ndisasm -o 0x7c00 boot.bin 反彙編後的代碼:
 
看其中一行: 
jmp word 0x7c16
比較確定: 標號代表實際的物理地址。
可是仔細一想, 實際的物理地址不是20位的嗎? 這裏怎麼才16位?
看了書才知道:段基址是0x0000, 所以這個還是段內偏移。
爲什麼需要在最前面加上一條"org 7c00h"?
從後面的代碼可以看到, 所有的地址都是以7c00h爲基準的。 如果在最前面改爲“org 0000h”,那麼剛纔的
“jmp word 0x7c16”就會變成“jmp word 0x0016”
可是引導代碼都是被BIOS加載到0x7c00執行的, 如果執行上述的那條跳轉指令, 程序就走到0000:0016去了,顯然跑飛了。
所以, 在編寫彙編代碼時, 一定要知道你的代碼在內存中的首地址,否則一旦執行跳轉指令,肯定跑飛。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章