cs 暫存器 和 ip 暫存器:
經過前面對段的介紹,相信各位朋友對段暫存器應該也有一定的了解了,
下面將要介紹的是一組非常非常重要的暫存器,即 cs:ip 。
cs:ip 兩個暫存器指示了 cpu 當前將要讀取的指令的位址,其中 cs 為**段暫存器,而 ip 為指令指標暫存器 。
什麼叫做指示了 cpu 當前將要讀取的指令呢?在 8086 cpu 中,為什麼 cpu 會自動的執行指令呢?
這些指令肯定是存放在記憶體中的,但是 cpu 怎麼知道這些指令存放在記憶體的那個位置呢?
比如,我有下面的兩條指令要執行:
mov ax,1234h而假設這兩條指令在記憶體中存放為:mov bx,ax
很顯然, 1000h:0000h 指向的是 mov ax,1234h 的首位址,
如果 cpu 要讀取到我的指令的話,很顯然,必須要知道位址 1000h:0000h ,
然後 cpu 就可以根據這個首位址,將彙編指令mov ax,1234h 所對應的機器碼讀入到 cpu 的指令暫存器中,
最後便可以在 cpu 中進行處理了。
但關鍵是 cpu 如何知道我的 1000h:0000h 這個首位址?
其實這就需要使用到 cs:ip 這個暫存器組了 。
當我們執行乙個可執行檔案時,很明顯,我們需要另外乙個程式來將這個可執行檔案載入到記憶體當中,
關於這個載入可執行檔案的程式,我們在這裡不管他,點一下即可,
一般是通過作業系統的外殼程式(也就是傳說中的 shell 程式),
shell 將可執行檔案載入到記憶體中以後,就會設定 cpu 中的兩個暫存器,
即設定 cs:ip 兩個暫存器指向可執行檔案的起始位址,此後 cpu 便從這個起始位址開始讀取記憶體中的指令,並且執行,
比如我們在寫匯程式設計序時,通常會使用 start 標記,其實這個標記就是用來標記起始位址的,
當將乙個匯程式設計序編譯,連線成可執行檔案以後,再通過作業系統的 shell 程式將可執行檔案載入到記憶體中以後,
這個 start 所標記處的位址就是整個可執行檔案的起始位址了 。
也就是說,當乙個可執行檔案載入到記憶體中以後,cs:ip 兩個暫存器便指向了這個可執行檔案的起始位址,
然後 cpu 就可以從這個起始位址開始往下讀取指令,
當讀取完指令後,cs:ip 將會自動的改變,基本上是改變 ip ,從而指向下一條要讀取的指令,這樣就可以執行這個可執行檔案了 。
最後再對 cs:ip 總結一下:
你想讓 cpu 執行哪行指令,你就讓 cs:ip 指向儲存有指令的那塊記憶體即可。
任何時候,cs:ip 指向的位址中的內容都是 cpu 當前執行的指令。
下面我們來看乙個 demo,並詳細觀察其執行的過程:
assume cs:codes語句的執行過程如下:codes segment
start:
mov ax,1234h
mov bx,ax
mov ah,4ch
int 21h
codes ends
end start
從上面的截圖中可以看出,當我使用 shell (在 dos 下也就是 command 命令直譯器)將可執行檔案載入進記憶體後,
可以看到,整個程式的起始位址為 0c54h : 0000 h ,並且,可以看到 cs 的位址為 0c54h ,ip 的位址為 0000h,
這正好吻合我們上面對 cs:ip 的分析,很明顯,cpu 將會讀取 mov ax ,1234h 到 cpu 中並且執行 ,
然後我們繼續向下看:
可以看到,我們單步執行後,ax 中的值編成了 1234h ,而 ip 暫存器中的值變成了 0003h,
對於 ax 中的值的改變,我們是能夠理解的,但是 ip 中的值為什麼會從 0000h 變到 0003h 呢?
從最上面的一幅關於指令在記憶體中的存放可以看出mov ax ,1234h 在記憶體中需要 3 個記憶體單元存放,
也就是 cpu 為了執行mov ax ,1234h 這條指令,已經將記憶體中相對應的 3 個記憶體單元讀入記憶體中了,
執行完這條指令後,自然,cpu 就要將偏移位址向下移動 3 個單元,從而使得 cs:ip 指向下一條需要執行的指令了 ,
為了更深刻的理解,我們再來繼續看執行過程,
從最上面的一幅關於指令在記憶體中的存放可以看出 mov bx ,ax 在記憶體中只佔 2 個記憶體單元,
這也就是為什麼 ip 這一次只向下移動了 2 個單元的緣故 。
CS 暫存器 和 IP 暫存器
下面將要介紹的是一組非常非常重要的暫存器,即 cs ip cs ip 兩個暫存器指示了 cpu 當前將要讀取的指令的位址,其中cs 為 段暫存器,而ip 為指令指標暫存器。什麼叫做指示了 cpu 當前將要讀取的指令呢?在 8086 cpu 中,為什麼 cpu 會自動的執行指令呢?這些指令肯定是存放在...
8086暫存器介紹
8086 有14個16位暫存器,這14個暫存器按其用途可分為 1 通用暫存器 2 指令指標 3 標誌暫存器和 4 段暫存器等4類。1 通用暫存器有8個,又可以分成2組,一組是資料暫存器 4個 另一組是指標暫存器及變址暫存器 4個 資料暫存器分為 ah al ax accumulator 累加暫存器,...
彙編暫存器 8086
一 組合語言中,為什麼si和di不能同時使用彙編 其實你可以想一下,這兩個暫存器的意思,si源變址暫存器,di目地變址暫存器,既然是變址暫存器,那麼他們肯定是在某個位址的基礎上進行偏移變化,由此我們就得出了需要基址暫存器。你要是把這兩個暫存器同時使用,那你位址變化的基址都沒有,你該怎麼變化呢?你在誰...