8086 CS和IP暫存器

2021-07-23 11:27:27 字數 2634 閱讀 1942

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目地變址暫存器,既然是變址暫存器,那麼他們肯定是在某個位址的基礎上進行偏移變化,由此我們就得出了需要基址暫存器。你要是把這兩個暫存器同時使用,那你位址變化的基址都沒有,你該怎麼變化呢?你在誰...