標籤:

當載入二進位程序時ip不等於0時

當載入二進位程序時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的辦法:

  1. 使用org偽指令。

2. 在每一條與地址相關的指後面加上一個修正的數,它的值等於ip的初始值。

3. 在彙編程序的開頭加上一條跳轉指令jmp 載入二進位程序時CS的值:0005h(0005h表示這條跳轉指令的機器碼長度),這條指令執行後程序跳轉到它後面的那條指令,修改了ip的值使得恰好開始準備執行下一條指令。

說明:1的方法很多書中都有,2的方法可見《x86彙編語言-從實模式到保護模式》這本書的第5.5節。3的方法可見riptutorial.com/x86/exa

推薦閱讀:

64 位環境彙編的 "Hello World!
"

從C語言到彙編(四)while語句

TAG:彙編語言 |