當載入二進位程序時ip不等於0時
來自專欄每天黑一黑
對於intel 8086的彙編程序,有時你很奇怪為什麼有的彙編程序要加上org xxx的偽指令,這是因為彙編器的彙編過程中,建立的是以起始偏移地址為0開始的模型,這個模型正好適應與載入時ip的初始值等於0的cpu的分段模型。當你用彙編器把程序彙編成二進位程序時,如果載入程序時ip的初始值不等於0,而你的程序中恰好有與地址相關的指令時,則需要使用org xxx的偽指令對彙編程序中的這些地址進行「修正」,這個修正的值等於載入二進位程序時ip的初始值。記住不管什麼情況下,彙編器得到的程序要想正確執行,就必須遵守CPU的運行規則。當你同時理解intel 8086的分段模型和彙編器的地址生成原則時,理解這點非常簡單。
什麼時候會出現載入二進位程序時ip的初始值不等於0的情況呢?最典型的就是開機時bios交棒給引導程序時,執行引導程序的第一條指令前CS=0x0000,IP=0x7C00,還有種我知道的情況是以前的COM格式的程序(ORG偽指令的作用是什麼?)。
我發現了三種可以通過修改彙編程序來應對ip初始值不等於0的辦法:
- 使用org偽指令。
2. 在每一條與地址相關的指後面加上一個修正的數,它的值等於ip的初始值。
3. 在彙編程序的開頭加上一條跳轉指令jmp 載入二進位程序時CS的值:0005h(0005h表示這條跳轉指令的機器碼長度),這條指令執行後程序跳轉到它後面的那條指令,修改了ip的值使得恰好開始準備執行下一條指令。
說明:1的方法很多書中都有,2的方法可見《x86彙編語言-從實模式到保護模式》這本書的第5.5節。3的方法可見http://www.riptutorial.com/x86/example/19574/unreal-mode
推薦閱讀:
※64 位環境彙編的 "Hello World!
"
※從C語言到彙編(四)while語句
TAG:彙編語言 |