汇编语言之寄存器(CPU工作原理)
1、介紹
一個典型的CPU,由運算器、控制器、寄存器等器件組成,對于游戲修改者來說,重點學(xué)習(xí)寄存器,其它不必管。
不同的CPU,寄存器的個數(shù)、結(jié)構(gòu)是不相同的,8086CPU有14個寄存器,每個寄存器有一個名稱,我們對它進(jìn)行分類:
1.通用寄存器:AX、BX、CX、DX
2.段寄存器:CS、SS、DS、ES
3.指針寄存器:SP、BP
4.變址寄存器:SI、DI
5.指令指針寄存器:IP
6.標(biāo)志寄存器:FR
2、通用寄存器
AX、BX、CX、DX這4個寄存器通常用來存放一般性的數(shù)據(jù),被稱為通用寄存器。
以AX為例,寄存器的邏輯結(jié)構(gòu)圖如下:
字在寄存器中的存儲字在寄存器中的存儲
3 字在寄存器中的存儲
4、物理地址
存儲單元又叫內(nèi)存單元,以后我們多數(shù)用內(nèi)存單元這一名稱。
所有的內(nèi)存單元構(gòu)成的存儲空間是一個一維的線性空間,每一個內(nèi)存單元在這個空間中都有唯一的地址,我們將這個唯一的地
址稱為物理地址。
CPU通過地址總線送入內(nèi)存的,必須是一個內(nèi)存單元的物理地址,在CPU向地址總線上發(fā)出物理地址之前,必須要在內(nèi)部先
形成這個物理地址,不同的CPU可以有不同的形成物理地址的方式,我們現(xiàn)在討論8086CPU是如何在內(nèi)部形成內(nèi)存單元的物理
地址的。
5、 8086CPU給出物理地址的方法
8086CPU有20位地址總線,可以傳送20位地址,而8086CPU內(nèi)部結(jié)構(gòu)是16位的,一次性只能傳送16位的地址,怎么
解決20位地址與16位地址不一致的問題呢?8086CPU采用一種在內(nèi)部用2個16位地址合成的方法來形成一個20位的物理地
址。
當(dāng)8086CPU要讀寫內(nèi)存時,怎樣在CPU內(nèi)部形成物理地址的呢?
1:CPU中的相關(guān)部件提供2個16位的地址,一個稱為段地址,另一個稱為偏移地址。
2:段地址和偏移地址通過內(nèi)部總線送入一個稱為地址加法器的部件。
3:地址加法器將這兩個16位地址合成為1個20位的物理地址。
地址加法器采用“段地址×16+偏移地址”的方法合成物理地址。即:段地址×16+偏移地址=物理地址。
“段地址×16”可以理解為段地址的16倍,以下這個說法更好理解。
我們把16轉(zhuǎn)化為十六進(jìn)制10,然后計算一下。假設(shè)段地址=2A7,2A7×10=2A70,計算結(jié)果2A70相對于段地址2A7左
移了一位,所以,段地址×16可以理解為:段地址左移一位。
問答題:如果段地址=A100,偏移地址=42B,那么,物理地址=?
答:段地址×16=段地址左移一位,即A100左移一位=A1000,A1000+42B=A142B,所以,物理地址是:A142B。
8086CPU要訪問地址為123C8H的內(nèi)存單元,此時,地址加法器的工作過程如下圖所示(圖中數(shù)據(jù)皆為十六進(jìn)制表示):
6 ?CS和IP
8086CPU在訪問內(nèi)存時,要由相關(guān)部件提供內(nèi)存單元的段地址和偏移地址,然后送入地址加法器合成物理地址,那么,是什
么部件提供段地址呢?是段寄存器提供段地址。8086CPU有4個段寄存器:CS、DS、SS、ES,本章先講解CS。
CS和IP是8086CPU中2個最為關(guān)鍵的寄存器,它們指示了CPU當(dāng)前要讀取指令的地址,我們看一下CE,可以看出在游
戲中,什么是CPU要讀取的指令地址,見下圖:
?
?
上圖指令執(zhí)行后,AX中的數(shù)值為0123H。那么,接下來就是讀取、執(zhí)行下一條指令 BB 03 00(mov bx,0003h)了。
CS和IP的重要性在于它們的數(shù)值提供了CPU要執(zhí)行指令的地址。
在1.5節(jié)中,我們說過,在內(nèi)存中指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息,CPU在工作的時候,把有的信息看作指令,
把有的信息看作數(shù)據(jù),那么,CPU在什么時候把它看作指令?在什么時候把它看作數(shù)據(jù)呢?現(xiàn)在我們可以回答第一個問題了。
??? 答:只要內(nèi)存單元(二進(jìn)制信息)被CS:IP指向,那么,這些內(nèi)存單元就會被CPU看作指令執(zhí)行。
7 ?修改CS和IP的指令
Mov被稱為傳送指令,可以修改大部分寄存器的值。如:mov ax,123H,將ax中的值設(shè)為123H,同樣地,我們可以mov
bx,2a4H? mov cx,5f0H? mov dx,b29H 等等。但是,mov不能修改CS和IP這兩個寄存器的值,因為8086CPU沒有提
供這樣的功能。
要修改CS和IP的值,可以用jmp指令,事實上,還有一些指令是可以修改CS和IP的,這些指令被統(tǒng)稱為轉(zhuǎn)移指令,這
個在后面的課程會講到,現(xiàn)在先學(xué)習(xí)這個最簡單的轉(zhuǎn)移指令:jmp。
若想同時修改CS和IP的值,可用形如“jmp 段地址:偏移地址”的指令完成。如:jmp 2ae3:9,執(zhí)行后:CS=2ae3H,
IP=9H,CPU將從2ae39H處讀取指令。
“jmp 段地址:偏移地址”指令的功能為:用指令中給出的段地址修改CS,偏移地址修改IP。
若想僅修改IP的值,可用形如“jmp 某一合法寄存器”的指令完成。如:jmp ax,執(zhí)行前ax=437aH,CS=17f0H,IP=
423cH,執(zhí)行后,CS不變,IP=437aH。
“jmp 某一合法寄存器”指令的功能為:用寄存器中的值修改IP。為什么叫“某一合法寄存器”?因為不是所有寄存器都可
以修改IP。
8?代碼段
在編程時,可以根據(jù)需要,將一組內(nèi)存單元定義為一個段。段分3種類型:代碼段、數(shù)據(jù)段、棧段。
對于8086PC機,我們可以將長度為N(N≤64KB)的一組代碼(機器指令和匯編指令),存在一組地址連續(xù)、起始地址為
16的倍數(shù)的內(nèi)存單元中,我們將這一組內(nèi)存單元定義為代碼段。
比如,將:? 機器指令??????? 匯編指令
??????????? B8 00 00?????? mov ax,0000H
??????????? 05 23 01?????? add ax,0123H
??????????? 8B D8????????? mov bx,ax
??????????? FF E3????????? jmp bx
這段長度為10字節(jié)的指令,存放在123B0H~123B9H的一組內(nèi)存單元中,我們就可以認(rèn)為這是一個代碼段。若要讓CPU
執(zhí)行這些指令,必須要將CS:IP指向代碼段中第一條指令的首地址(123B0H)
?
總結(jié)
以上是生活随笔為你收集整理的汇编语言之寄存器(CPU工作原理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: 汇编语言之寄存器(内存访问)