寄存器簡(jiǎn)介
寄存器是CPU內(nèi)部用來(lái)存放數(shù)據(jù)的一些小型存儲(chǔ)區(qū)域,用來(lái)暫時(shí)存放參與運(yùn)算的數(shù)據(jù)和運(yùn)算結(jié)果。其實(shí)寄存器就是一種常用的時(shí)序邏輯電路,但這種時(shí)序邏輯電路只包含存儲(chǔ)電路。寄存器的存儲(chǔ)電路是由鎖存器或觸發(fā)器構(gòu)成的,因?yàn)橐粋€(gè)鎖存器或觸發(fā)器能存儲(chǔ)1位二進(jìn)制數(shù),所以由N個(gè)鎖存器或觸發(fā)器可以構(gòu)成N位寄存器。寄存器是中央處理器內(nèi)的組成部分。寄存器是有限存儲(chǔ)容量的高速存儲(chǔ)部件,它們可用來(lái)暫存指令、數(shù)據(jù)和位址。在計(jì)算機(jī)領(lǐng)域,寄存器是CPU內(nèi)部的元件,包括通用寄存器、專用寄存器和控制寄存器。寄存器擁有非常高的讀寫(xiě)速度,所以在寄存器之間的數(shù)據(jù)傳送非???。Cortex-M4總共有18個(gè)寄存器,相比傳統(tǒng)ARM(如ARM7/ARM9/Cortex-A系列)的38個(gè)寄存器已減少很多,減少了內(nèi)核核心面積(Die-size)。寄存器對(duì)于編譯器非常友好易用,例如:包含靈活的寄存器配置,任意寄存器之間可實(shí)現(xiàn)單周期乘法,任意寄存器可以作為數(shù)據(jù)、結(jié)構(gòu)或數(shù)組的指針。此外,Cortex-M4還包含4個(gè)特殊功能寄存器PRIMASK、FAUI。TMASK、BASEPRI和CONTROL。
在數(shù)字電路中,用來(lái)存放二進(jìn)制數(shù)據(jù)或代碼的電路稱為寄存器。寄存器是由具有存儲(chǔ)功能的觸發(fā)器組合起來(lái)構(gòu)成的。一個(gè)觸發(fā)器可以存儲(chǔ)1位二進(jìn)制代碼,存放門(mén)位二進(jìn)制代碼的寄存器需用逐個(gè)觸發(fā)器來(lái)構(gòu)成。 對(duì)寄存器中的觸發(fā)器只要求它們具有置1,置0的功能即可,因而無(wú)論是用電平觸發(fā)的觸發(fā)器,還是用脈沖觸發(fā)或邊沿觸發(fā)的觸發(fā)器,都可以組成寄存器。 由電平觸發(fā)的動(dòng)作特點(diǎn)可知,在CLK高電平期間,Q端的狀態(tài)跟隨D端狀態(tài)的改變而改變;CLK變成低電平以后,Q端將保持CLK變?yōu)榈碗娖綍r(shí)刻D端的狀態(tài)。 74HC175則是用CMOS邊沿觸發(fā)器組成的4位寄存器,根據(jù)邊沿觸發(fā)的動(dòng)作特點(diǎn)可知,觸發(fā)器輸出端的狀態(tài)僅僅取決于CLK上升沿到達(dá)時(shí)刻D端的狀態(tài)??梢?jiàn),雖然74LS75和74HC175都是4位寄存器,但由于采用了不同結(jié)構(gòu)類型的觸發(fā)器,所以動(dòng)作特點(diǎn)是不同的。為了增加使用的靈活性,在有些寄存器電路中還附加了一些控制電路,使寄存器又增添了異步置零、輸出三態(tài)控制和保持等功能。這里所說(shuō)的保持,是指CLK信號(hào)到達(dá)時(shí)觸發(fā)器不隨D端的輸入信號(hào)而改變狀態(tài),保持原來(lái)的狀態(tài)不變。 上面介紹的兩個(gè)寄存器電路中,接收數(shù)據(jù)時(shí)所有各位代碼都是同時(shí)輸入的,而且觸發(fā)器中的數(shù)據(jù)是并行地出現(xiàn)在輸出端的,因此將這種輸入、輸出方式稱為并行輸入、并行輸出方式。
1.通用寄存器組通用寄存器組包括AX、BX、CX、DX4個(gè)16位寄存器,用以存放16位數(shù)據(jù)或地址。也可用作8位寄存器。用作8位寄存器時(shí)分別記為AH、AL、BH、BL、CH、CL、DH、DL。只能存放8位數(shù)據(jù),不能存放地址。它們分別是AX、BX、CX、DX的高八位和低八位。若AX=1234H,則AH=12H,AL=34H。通用寄存器通用性強(qiáng),對(duì)任何指令,它們具有相同的功能。為了縮短指令代碼的長(zhǎng)度,在8086中,某些通用寄存器用作專門(mén)用途。例如,串指令中必須用CX寄存器作為計(jì)數(shù)寄存器,存放串的長(zhǎng)度,這樣在串操作指令中不必給定CX的寄存器號(hào),縮短了串操作指令代碼的長(zhǎng)度。下面一一介紹:AX(AH、AL):累加器。有些指令約定以AX(或AL)為源或目的寄存器。輸入/輸出指令必須通過(guò)AX或AL實(shí)現(xiàn),例如:端口地址為43H的內(nèi)容讀入CPU的指令為INAL,43H或INAX,43H。目的操作數(shù)只能是AL/AX,而不能是其他的寄存器。 BX(BH、BL):基址寄存器。BX可用作間接尋址的地址寄存器和基地址寄存器,BH、BL可用作8位通用數(shù)據(jù)寄存器。CX(CH、CL):計(jì)數(shù)寄存器。CX在循環(huán)和串操作中充當(dāng)計(jì)數(shù)器,指令執(zhí)行后CX內(nèi)容自動(dòng)修改,因此稱為計(jì)數(shù)寄存器。 DX(DH、DL):數(shù)據(jù)寄存器。除用作通用寄存器外,在I/O指令中可用作端口地址寄存器,乘除指令中用作輔助累加器。 2.指針和變址寄存器BP( Base Pointer Register):基址指針寄存器。 SP( Stack Pointer Register):堆棧指針寄存器。 SI( Source Index Register):源變址寄存器。DI( Destination Index Register):目的變址寄存器。 這組寄存器存放的內(nèi)容是某一段內(nèi)地址偏移量,用來(lái)形成操作數(shù)地址,主要在堆棧操作和變址運(yùn)算中使用。BP和SP寄存器稱為指針寄存器,與SS聯(lián)用,為訪問(wèn)現(xiàn)行堆棧段提供方便。通常BP寄存器在間接尋址中使用,操作數(shù)在堆棧段中,由SS段寄存器與BP組合形成操作數(shù)地址即BP中存放現(xiàn)行堆棧段中一個(gè)數(shù)據(jù)區(qū)的“基址”的偏移量,所以稱BP寄存器為基址指針。 SP寄存器在堆棧操作中使用,PUSH和POP指令是從SP寄存器得到現(xiàn)行堆棧段的段內(nèi)地址偏移量,所以稱SP寄存器為堆棧指針,SP始終指向棧頂。 寄存器SI和DI稱為變址寄存器,通常與DS一起使用,為訪問(wèn)現(xiàn)行數(shù)據(jù)段提供段內(nèi)地址偏移量。在串指令中,其中源操作數(shù)的偏移量存放在SⅠ中,目的操作數(shù)的偏移量存放在DI中,SI和DI的作用不能互換,否則傳送地址相反。在串指令中,SI、DI均為隱含尋址,此時(shí),SI和DS聯(lián)用,Dl和ES聯(lián)用。3.段寄存器8086/8088CPU可直接尋址1MB的存儲(chǔ)器空間,直接尋址需要20位地址碼,而所有內(nèi)部寄存器都是16位的,只能直接尋址6KB,因此采用分段技術(shù)來(lái)解決。將1MB的存儲(chǔ)空間分成若干邏輯段,每段最長(zhǎng)64KB,這些邏輯段在整個(gè)存儲(chǔ)空間中可浮動(dòng)。 8086/8088CPU內(nèi)部設(shè)置了4個(gè)16位段寄存器,它們分別是代碼段寄存器CS、數(shù)據(jù)段寄存器DS、堆棧段寄存器SS、附加段寄存器ES、由它們給出相應(yīng)邏輯段的首地址,稱為“段基址”。段基址與段內(nèi)偏移地址組合形成20位物理地址,段內(nèi)偏移地址可以存放在寄存器中,也可以存放在存儲(chǔ)器中。 例如:代碼段寄存器CS存放當(dāng)前代碼段基地址,IP指令指針寄存器存放了下一條要執(zhí)行指令的段內(nèi)偏移地址,其中CS=2000H,IP=001AH。通過(guò)組合,形成20位存儲(chǔ)單元的尋址地址為2001AH。代碼段內(nèi)存放可執(zhí)行的指令代碼,數(shù)據(jù)段和附加段內(nèi)存放操作的數(shù)據(jù),通常操作數(shù)在現(xiàn)行數(shù)據(jù)段中,而在串指令中,目的操作數(shù)指明必須在現(xiàn)行附加段中。堆棧段開(kāi)辟為程序執(zhí)行中所要用的堆棧區(qū),采用先進(jìn)后出的方式訪問(wèn)它。各個(gè)段寄存器指明了一個(gè)規(guī)定的現(xiàn)行段,各段寄存器不可互換使用。程序較小時(shí),代碼段、數(shù)據(jù)段、堆棧段可放在一個(gè)段內(nèi),即包含在64KB之內(nèi),而當(dāng)程序或數(shù)據(jù)量較大時(shí),超過(guò)了64KB,那么可以定義多個(gè)代碼段或數(shù)據(jù)段、堆棧段、附加段?,F(xiàn)行段由段寄存器指明段地址,使用中可以修改段寄存器內(nèi)容,指向其他段。有時(shí)為了明確起見(jiàn),可在指令前加上段超越的前綴,以指定操作數(shù)所在段。 4.指令指針寄存器IP8086/8088CPU中設(shè)置了一個(gè)16位指令指針寄存器IP,用來(lái)存放將要執(zhí)行的下一條指令在現(xiàn)行代碼段中的偏移地址。程序運(yùn)行中,它由BIU自動(dòng)修改,使IP始終指向下一條將要執(zhí)行的指令的地址,因此它是用來(lái)控制指令序列的執(zhí)行流程的,是一個(gè)重要的寄存器。8086程序不能直接訪問(wèn)IP,但可以通過(guò)某些指令修改IP的內(nèi)容。例如,當(dāng)遇到中斷指令或調(diào)用子程序指令時(shí),8086自動(dòng)調(diào)整IP的內(nèi)容,將IP中下一條將要執(zhí)行的指令地址偏移量入棧保護(hù),待中斷程序執(zhí)行完畢或子程序返回時(shí),可將保護(hù)的內(nèi)容從堆棧中彈出到IP,使主程序繼續(xù)運(yùn)行。在跳轉(zhuǎn)指令時(shí),則將新的跳轉(zhuǎn)目標(biāo)地址送入IP,改變它的內(nèi)容,實(shí)現(xiàn)了程序的轉(zhuǎn)移。 5.標(biāo)志寄存器FR標(biāo)志寄存器FR也稱程序狀態(tài)字寄存器。 FR是16位寄存器,其中有9位有效位用來(lái)存放狀態(tài)標(biāo)志和控制標(biāo)志。狀態(tài)標(biāo)志共6位,CF、PF、AF、ZF、SF和OF,用于寄存程序運(yùn)行的狀態(tài)信息,這些標(biāo)志往往用作后續(xù)指令判斷的依據(jù)??刂茦?biāo)志有3位,IF、DF和TF,用于控制CPU的操作,是人為設(shè)置的。