16位CPU所含有的寄存器有(見圖2.1中16位寄存器部分):
4個數據寄存器(AX、BX、CX和DX)
2個變址和指針寄存器(SI和DI) 2個指針寄存器(SP和BP) ,32位CPU增加2個16位的段寄存器:FS和GS。
4個段寄存器(ES、CS、SS和DS)
1個指令指針寄存器(IP) 1個標志寄存器(Flags)
一共14個寄存器,或者16個
16位CPU內部有20根地址線,其編碼區間為:0000H~FFFFFH,所以,它可直接訪問的物理空間為1M(220)字節。
如果用16位寄存器來訪問內存的話,則只能訪問內存的最低端的64K,其它的內存將無法訪問。為了能用16位寄存器來有效地訪問1M的存儲空間,16位CPU采用了內存分段的管理模式,並引用段寄存器的概念。
個人猜測:堆棧有1M的限制,是不是因為這個歷史原因?
物理地址PA=段地址×16 + 偏移量(Offset)
有效地址EA=Effective Address(段內偏移)
CS:IP 段寄存器CS指向存放程序的內存段,IP是用來存放下條待執行的指令在該段的偏移量,把它們合在一起可在該內存段內取到下次要執行的指令。
SS:SP 段寄存器SS指向用於堆棧的內存段,SP是用來指向該堆棧的棧頂,把它們合在一起可訪問棧頂單元。另外,當偏移量用到了指針寄存器BP,則其缺省的段寄存器也是SS,並且用BP可訪問整個堆棧,不僅僅是只訪問棧頂。
DS:ALL 段寄存器DS指向數據段,ES指向附加段,在存取操作數時,二者之一和一個偏移量合並就可得到存儲單元的物理地址。該偏移量可以是具體數值、符號地址和指針寄存器的值等之一,具體情況將由指令的尋址方式來決定。
ES:DI 在進行串操作時,其目的地址的段寄存器規定為ES
總結:程序頻繁訪問的數據段用DS來指向,不太經常訪問的數據段可用ES、FS和GS等來指向。
1.立即尋址方式 MOV AH, 80H(直接給寄存器賦值)
2. 寄存器尋址方式(源或者目的有一個是寄存器)
2.1) 源操作數是寄存器尋址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是雙字,字和字節類型的內存變量。
2.2) 目的操作數是寄存器尋址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
2.3) 源和目的操作數都是寄存器尋址方式
如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。
3. 直接尋址方式(地址值在括號里)
MOV BX, [1234H] (默認使用DS)
MOV ES:[1000H], AX
4. 寄存器間接尋址方式(寄存器在括號里)
MOV BX,[DI]
操作數的有效地址用SI、DI、BX和BP等四個寄存器之一來指定,稱這種尋址方式為寄存器間接尋址方式。
若有效地址用SI、DI和BX來指定,則其缺省的段寄存器為DS;
若有效地址用BP來指定,則其缺省的段寄存器為SS(即:堆棧段)。
5. 寄存器相對尋址方式(一個寄存器和一個立即數在括號里,並且還要計算)
MOV BX, [SI+100H]
6. 基址加變址尋址方式(兩個寄存器在括號里,並且還要計算)
MOV BX, [BX+SI]
7. 相對基址加變址尋址方式(兩個寄存器在括號里和一個立即數在括號里,並且還要計算)
MOV AX, [BX+SI+200H]
幾個例子:
例子1. MOV BX, [SI+100H]
尋址路線為:
PA=(DS)*16+(SI)+100H
例子2. MOV BX, [BX+SI]
尋址路線為:
PA=(DS)*16+=(BX)+(SI)
例子3. MOV AX, [BX+SI+200H]
尋址路線為:
PA=(DS)*16+(BX)+(SI)+200H
取數據的規則:高高低低
比如內存單元12445H的Byte值為15H,12446的Byte內容為27H,那么12445的Word值為2715H,而BX的值也是2715.
注:為了簡化理解,低地址在上面,高地址在下面(所謂向下生長)。與堆棧模型一致,參考:
http://www.cnblogs.com/findumars/archive/2012/10/28/2743121.html
8. 32位地址的尋址方式
在用16位寄存器來訪問存儲單元時,只能使用基地址寄存器(BX和BP)和變址寄存器(SI和DI)來作為地址偏移量的一部分。
但在用32位寄存器尋址時,不存在上述限制:
32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位變址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
計算公式:基址寄存器+變址寄存器+比例因子+偏移常量。
段寄存器的判斷與使用:
1)地址中寄存器的書寫順序決定該寄存器是基址寄存器,還是變址寄存器,例如:
[EBX+EBP]中的EBX是基址寄存器,EBP是變址寄存器。
[EBP+EBX]中的EBP是基址寄存器,EBX是變址寄存器。
2)基址寄存器是EBP或ESP時,默認的段寄存器是SS,否則,默認的段寄存器是DS,例如:
MOV AX, [123456H] ;默認段寄存器DS
MOV EAX, [EBX+EBP] ;默認段寄存器DS
MOV EBX, [EAX+100H] ;默認段寄存器DS
MOV EBX, [EBP+EBX] ;默認段寄存器SS
MOV [ESP+EDX*2], AX ;默認段寄存器SS
MOV AX, [ESP] ;默認段寄存器SS
3)在指令中,如果使用段前綴的方式,那么,顯式段寄存器優先。
MOV EDX, ES:[EAX*4+200H] ;顯式段寄存器ES
MOV EBX, GS:[EAX+EDX*2+300H] ;顯式段寄存器GS
為了明確指令中存儲單元的屬性,可把指令“MOV [BX], 1H”可改寫成:
MOV byte ptr [BX], 1H 或 MOV word ptr [BX], 1H
一個字節的內容是該字節單元內存放的二進制信息;
一個字的內容是該字地址所指向的單元及其后繼一個單元的內容拼接而成;
一個雙字的內容是該字地址所指向的單元及其后繼三個單元的內容拼接而成。