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