本章講的是CPU的內部結構,CPU由運算器、控制器、寄存器組成,這三種器件由CPU內部總線連接。
運算器進行信息處理,控制器進行控制器件工作,寄存器進行信息存儲。
名稱中帶有X的寄存器,據說這個X是mix的意思,即,混合。從A到D總共有4個通用寄存器,即A(accumulator)X(累加寄存器)、B(base)X(基址寄存器)、C(count)X(計數寄存器)、D(data)X(數據寄存器)。
寄存器是有位數的,而且有高低位之分,高位在寄存器左邊,低位在右邊。
X之所以是mix的意思是指X=H+L,而H代表high,L代表low,H和L都可以單獨當成8位寄存器來使用,L在H的右邊也就是低位。
比如說AX=AH+AL,AH和AL都可以單獨使用。
因此16位的通用寄存器可以存儲的最大值是216-1,而8位的H或L能存儲的最大值是28-1。
MOV
DES SOU:把SOU中的數據送入DES中,即,DES=SOU。
ADD
DES SOU:把SOU所代表的數據加到DES上,即,DES+=SOU。
由ADD指令所得的結果如果超出了寄存器所能保存的數值,那么超出的高位將被丟棄。
計算只能在同類型的寄存器中計算,比如說都是X或者都是H等。并且操作數不能大于寄存器所能表示的最大值。
16位的CPU是啥意思?
1、運算器一次最多處理16bit數據;
2、寄存器寬度為16bit;
3、寄存器與運算器之間的通路是16bit。
8086CPU就是這樣的CPU。
8086CPU地址總線有20位,即尋址能力為220=2M,但是8086CPU是16位CPU如果不采取措施該CPU的尋址能力就是216=64K,這發揮不了CPU的全部能力。
于是8086CPU采用把兩個16位地址合成20位地址的辦法給出物理地址。
物理地址=段地址×16+偏移地址
CPU給出的一個16位地址為段地址,另一個16位地址為偏移地址,并把它倆放到地址加法器中按照上述公式進行16進制加法運算得到20位物理地址。具體過程可以參考P30。
本質就是基礎地址+偏移地址=物理地址,其中段地址就是基礎地址。
這里所說的段并不是程序在內存中的地址空間,更跟進程,線程啥的沒關系。它是對內存的一種劃分,是一種形象的稱謂。
根據公式“物理地址=段地址×16+偏移地址”可知段的起址必定是16的倍數,由偏移地址是16位推出段的最大長度是216=64K。
段地址:SA(Segment Address)
偏移地址:EA(Excursion Address)
所以,原來的公式可以表示為:SA×16+EA=PA(Physical Address)。
段寄存器是最后一個縮寫字母是S的寄存器,因為S代表Segment。在8086CPU中有4個段寄存器,它們是CS(Code Segment)、DS(Data
Segment)、ES(Extra Segment)、SS(Stack Segment)。
CS就是代碼段寄存器,這個不用再解釋了。
這里的IP不是Internet Protocol,而是Instruction
Pointer的縮寫,代表指令指針寄存器。
聯系上節加以說明的話,CS(Code Segment)就是SA(Segment Address),IP(Instruction Pointer)就是EA(Excursion
Address)。
因此公式SA×16+EA=PA可以變形為CS×16+IP=PA(Physical Address)。8086CPU就是執行CS×16+IP=PA處的指令。
取指令和執行指令的過程如下:
1、把CS提供的段地址和IP提供的偏移地址送入地址加法器進行計算得出物理地址PA;
2、把PA送入輸入輸出控制電路,輸入輸出控制電路把PA送入地址總線;
3、把PA處存儲的匯編指令通過數據總線送入CPU;
4、輸入輸出控制電路將匯編指令送入指令緩沖寄存器;
5、IP值根據已經讀入的匯編指令字節數N進行IP+=N運算以指向下一條匯編指令處;
6、把緩沖寄存器中的匯編指令送入執行控制器執行;
7、CPU從內存中IP所指處繼續讀取匯編指令。
CS和IP的初始態為CS=0x0000(書上寫的錯了),IP=0xFFFF,初始態的意思就是初始和復位時的狀態,根據CS×16+IP=PA,CPU最先取的指令是0xFFFF0處的指令,該指令一定很特殊。
本節可以得出一個推論——凡是被CS:IP指過的信息都是指令,同時它也是個判定——沒有被CS:IP指過的信息都不是指令。
在CPU中程序員能通過指令修改的只有寄存器。
MOV被稱為傳送指令。
轉移指令:能夠修改CS、IP內容的指令,JMP指令是其中之一,其用法如下所示:
JMP段地址偏移地址
JMP指令中的參數能直接修改CS和IP中的信息。另外,JMP也可以只帶一個參數,其用法如下:
JMP某一合法寄存器
該用法用這一合法寄存器中的值去重置IP中的值。