1.通用寄存器組通用寄存器組包括AX、BX、CX、DX4個16位寄存器,用以存放16位數(shù)據(jù)或地址。也可用作8位寄存器。用作8位寄存器時分別記為AH、AL、BH、BL、CH、CL、DH、DL。只能存放8位數(shù)據(jù),不能存放地址。它們分別是AX、BX、CX、DX的高八位和低八位。若AX=1234H,則AH=12H,AL=34H。通用寄存器通用性強,對任何指令,它們具有相同的功能。為了縮短指令代碼的長度,在8086中,某些通用寄存器用作專門用途。例如,串指令中必須用CX寄存器作為計數(shù)寄存器,存放串的長度,這樣在串操作指令中不必給定CX的寄存器號,縮短了串操作指令代碼的長度。下面一一介紹:AX(AH、AL):累加器。有些指令約定以AX(或AL)為源或目的寄存器。輸入/輸出指令必須通過AX或AL實現(xiàn),例如:端口地址為43H的內(nèi)容讀入CPU的指令為INAL,43H或INAX,43H。目的操作數(shù)只能是AL/AX,而不能是其他的寄存器。
BX(BH、BL):基址寄存器。BX可用作間接尋址的地址寄存器和基地址寄存器,BH、BL可用作8位通用數(shù)據(jù)寄存器。 [5] CX(CH、CL):計數(shù)寄存器。CX在循環(huán)和串操作中充當計數(shù)器,指令執(zhí)行后CX內(nèi)容自動修改,因此稱為計數(shù)寄存器。 [5] DX(DH、DL):數(shù)據(jù)寄存器。除用作通用寄存器外,在I/O指令中可用作端口地址寄存器,乘除指令中用作輔助累加器。 [5] 2.指針和變址寄存器BP( Base Pointer Register):基址指針寄存器。 [5] SP( Stack Pointer Register):堆棧指針寄存器。 [5] SI( Source Index Register):源變址寄存器。DI( Destination Index Register):目的變址寄存器。 [5] 這組寄存器存放的內(nèi)容是某一段內(nèi)地址偏移量,用來形成操作數(shù)地址,主要在堆棧操作和變址運算中使用。BP和SP寄存器稱為指針寄存器,與SS聯(lián)用,為訪問現(xiàn)行堆棧段提供方便。通常BP寄存器在間接尋址中使用,操作數(shù)在堆棧段中,由SS段寄存器與BP組合形成操作數(shù)地址即BP中存放現(xiàn)行堆棧段中一個數(shù)據(jù)區(qū)的“基址”的偏移量,所以稱BP寄存器為基址指針。 SP寄存器在堆棧操作中使用,PUSH和POP指令是從SP寄存器得到現(xiàn)行堆棧段的段內(nèi)地址偏移量,所以稱SP寄存器為堆棧指針,SP始終指向棧頂。 寄存器SI和DI稱為變址寄存器,通常與DS一起使用,為訪問現(xiàn)行數(shù)據(jù)段提供段內(nèi)地址偏移量。在串指令中,其中源操作數(shù)的偏移量存放在SⅠ中,目的操作數(shù)的偏移量存放在DI中,SI和DI的作用不能互換,否則傳送地址相反。在串指令中,SI、DI均為隱含尋址,此時,SI和DS聯(lián)用,Dl和ES聯(lián)用。
3.段寄存器8086/8088CPU可直接尋址1MB的存儲器空間,直接尋址需要20位地址碼,而所有內(nèi)部寄存器都是16位的,只能直接尋址6KB,因此采用分段技術來解決。將1MB的存儲空間分成若干邏輯段,每段最長64KB,這些邏輯段在整個存儲空間中可浮動。 [5] 8086/8088CPU內(nèi)部設置了4個16位段寄存器,它們分別是代碼段寄存器CS、數(shù)據(jù)段寄存器DS、堆棧段寄存器SS、附加段寄存器ES、由它們給出相應邏輯段的首地址,稱為“段基址”。段基址與段內(nèi)偏移地址組合形成20位物理地址,段內(nèi)偏移地址可以存放在寄存器中,也可以存放在存儲器中。 [5] 例如:代碼段寄存器CS存放當前代碼段基地址,IP指令指針寄存器存放了下一條要執(zhí)行指令的段內(nèi)偏移地址,其中CS=2000H,IP=001AH。通過組合,形成20位存儲單元的尋址地址為2001AH。 代碼段內(nèi)存放可執(zhí)行的指令代碼,數(shù)據(jù)段和附加段內(nèi)存放操作的數(shù)據(jù),通常操作數(shù)在現(xiàn)行數(shù)據(jù)段中,而在串指令中,目的操作數(shù)指明必須在現(xiàn)行附加段中。堆棧段開辟為程序執(zhí)行中所要用的堆棧區(qū),采用先進后出的方式訪問它。各個段寄存器指明了一個規(guī)定的現(xiàn)行段,各段寄存器不可互換使用。
程序較小時,代碼段、數(shù)據(jù)段、堆棧段可放在一個段內(nèi),即包含在64KB之內(nèi),而當程序或數(shù)據(jù)量較大時,超過了64KB,那么可以定義多個代碼段或數(shù)據(jù)段、堆棧段、附加段?,F(xiàn)行段由段寄存器指明段地址,使用中可以修改段寄存器內(nèi)容,指向其他段。有時為了明確起見,可在指令前加上段超越的前綴,以指定操作數(shù)所在段。 [5] 4.指令指針寄存器IP8086/8088CPU中設置了一個16位指令指針寄存器IP,用來存放將要執(zhí)行的下一條指令在現(xiàn)行代碼段中的偏移地址。程序運行中,它由BIU自動修改,使IP始終指向下一條將要執(zhí)行的指令的地址,因此它是用來控制指令序列的執(zhí)行流程的,是一個重要的寄存器。8086程序不能直接訪問IP,但可以通過某些指令修改IP的內(nèi)容。例如,當遇到中斷指令或調(diào)用子程序指令時,8086自動調(diào)整IP的內(nèi)容,將IP中下一條將要執(zhí)行的指令地址偏移量入棧保護,待中斷程序執(zhí)行完畢或子程序返回時,可將保護的內(nèi)容從堆棧中彈出到IP,使主程序繼續(xù)運行。在跳轉(zhuǎn)指令時,則將新的跳轉(zhuǎn)目標地址送入IP,改變它的內(nèi)容,實現(xiàn)了程序的轉(zhuǎn)移。