計算機中的數據存儲
匯編語言在處理數據時,必須准確指出數據存儲的地方。計算機中可用於存儲數據的裝置有:CPU內部的寄存器;計算機的存儲器;I/O端口(即I/O設備接口中的一些寄 存器)。
下面介紹8086系統的數據存儲。
寄存器
圖(8086的寄存器)所示為8086CPU中用於匯編語言程序設計的全部寄存器。根據用途不同,這些寄存器被分為三組:通用寄存器、專用寄存器和段寄存器。每個寄存器都有一個符號標志,作為寄存器的助記符。編程時,若所用數據存在某個寄存器中,就用其助記符來指出。
通用寄存器
通用寄存器用途多樣,使用靈活,是編程時主要使用的寄存器。
AX寄存器
AX為16位寄存器,可以存放一個16位定點數,是使用最多的寄存器。AX在系統中有特殊的地位,稱為16位累加寄存器,一些指令指定用AX存儲數據。合理使用AX,還可以有效提高一些指令的時、空效率。
AX還可以分解為兩個8位寄存器AH和AL。AH和AL可以作為獨立的8位寄存器使用,也可以組合成16位的AX使用(AH為高8位,AL為低8位)。例如,若(AX)= 458EH,則(AH)= 45H,(AL) = 8EH。
在處理8位數據時,AL具有與AX類似的地位,稱為8位累加寄存器。
BX、CX、DX寄存器
這三個寄存器也都是16位寄存器,也都能分解為兩個8位寄存器使用(如圖8086的寄存器所示)。
它們與AX有着相同的基本用途,但也有各自的獨特用法,如BX中的內容可被用來生成一個存儲器地址,以便據此訪問存儲器;CX在一些指令中被指定作為計數器使用;DX則在某些指令中被指定與AX配合,存儲一個32位數。
BP寄存器
BP是不能分解的16位寄存器,可以存放一個16位數據,其所存內容也可用來生成一個存儲器地址,並據此訪問存儲器。
SI和DI寄存器
這兩個寄存器也都是不能分解的16位寄存器,其基本用途與BP相似,且在某些指令中被指定使用。
專用寄存器
這幾個專用寄存器都有專一的用途,不可挪作他用。
SP寄存器
SP也叫堆棧指針,是一個16位寄存器,存放的是堆棧棧頂的地址,其內容將隨着進棧和出棧操作而動態改變。
IP寄存器
IP也叫指令指針,是一個16位計數寄存器,用來提供下一條要執行的指令的地址。CPU就是根據IP提供的指令地址,到存儲器中取出要執行的指令,並執行該指令的。一 條指令被取出后,CPU會修改IP中的地址,使其指向下一條指令......如此進行下去,CPU就能把整個程序全部執行完。
在匯編語言中,不能顯式使用IP,只有控制程序執行流程的一類指令(程序控制類指令)能夠隱式修改IP中的內容。
FLAGS寄存器
FLAGS為16位寄存器,是CPU中的狀態標志寄存器。8086系統使用該寄存器中的9位,記錄了9種狀態標志,如圖(8086的FLAGS)所示。
這些狀態標志可分為兩大類:條件標志和控制標志。
條件標志
條件標志記錄運算所產生的一些狀態,程序中可以根據這些狀態決定后續的操作。也就是說,條件標志是用來決定程序后續操作的條件。FLAGS中的條件標志有6個。
- CF標志(進位/借位標志):主要用於記錄加、減運算時,最高位上產生的進位或借位狀態。CF=0,無進位或借位;CF=1,有進位或借位。
- AF標志(輔助進位/借位標志):用於記錄加、減運算時,第3位上產生的進位或借位狀態。AF=0,無進位或借位;AF=1,有進位或借位。
- ZF標志(零標志):用於記錄運算結果是否為0。ZF=0,運算結果不為0;ZF=1, 運算結果為0。
- SF標志(符號標志):用於記錄運算結果的符號位(或最高位)狀態。SF=0,符號位為0(表示正號);SF=1,符號位為1(表示負號)。該標志主要用於帶符號數(補碼)運算。
- OF標志(溢出標志):主要用於記錄帶符號數(補碼)加、減運算時的溢出狀態。OF=0,無溢出;OF=1,有溢出。
- PF標志(奇偶標志):用於記錄運算結果的低8位中,“1”的個數是奇數個還是偶數個。PF=0,奇數個1;PF=1,偶數個1。該標志用於對數據進行奇偶校驗。
分析以下加法運算后,各條件標志的狀態
0 1 0 1 0 1 1 0
+ 1 0 1 1 Q 1 1 1
--------------------
[1] 0 0 0 0 1 1 0 1
分析:由運算結果可知,最高位上產生了進位[1],因此CF=1 (在計算機中,該進位不被納入運算結果,而是記錄在CF標志位上,如后續運算需要此進位,可從CF取得);由 式中可知,第3位(式中帶下畫線的位)未產生進位,故AF=0;運算結果(排除最高位的進位,下同)不為0,所以ZF=0;運算結果中的最高位(對帶符號數而言,為符號位)為0,故SF=0;如將式中兩數視為帶符號數的補碼,則為異號數相加,其和不會溢出,所以OF=0;運算結果的8位二進制數中,共有3個1,3為奇數,故PF=0。
控制標志
控制標志用於對CPU的某些工作方式進行控制,可通過專門的指令對其進行設置。FLAGS中的控制標志有3個。
- DF標志(方向標志):用於在字符串操作時,控制串指針的修改方向。DF=O,增量修改;DF=1,減量修改。
- IF標志(中斷標志):用於決定是否允許CPU響應外部的可屏蔽中斷請求。IF=O,禁止響應;IF=1,允許響應。
- TF標志(陷阱標志):用於決定CPU是否以單步(也稱單步陷阱)方式工作。TF=0,禁止單步方式;TF=1,允許單步方式。單步方式用於程序調試。在此方式下,CPU每執行完一條指令就會產生單步陷阱,暫停后續指令的執行。調試人員可以在此檢查程序的執行狀況是否正常,以便發現和排除程序中的錯誤。
段寄存器
8086系統由於硬件條件的限制,對存儲器的使用釆取分段模式。此模式下,存儲器地址分成段地址和段內偏移地址兩部分表示。段寄存器就是專門用來存放段地址的寄存器。
8086系統中,一個匯編語言程序最多可以同時操作4個活躍的段,所以共設有4個段寄存器,均為16位寄存器。
CS寄存器
CS是代碼段寄存器,存放代碼段的段地址。代碼段是存儲程序中指令代碼的段。
DS寄存器
DS是數據段寄存器,存放數據段的段地址。數據段是存儲程序中定義的各種變量的段。
ES寄存器
ES是附加段寄存器,存放附加數據段的段地址。當一個數據段的存儲空間不夠用時,可以定義附加數據段。
SS寄存器
SS是堆棧段寄存器,存放堆棧段的段地址。堆棧段是在程序中作為堆棧使用的存儲段。