80386處理器的尋址方式
在實式模式下,80386處理器的最大尋址空間仍然為1M,和8086/8088相似。即段地址*10H+段內(nèi)偏移地址,從而形成20位地址。此種模式下,段基址是16的倍數(shù),長度最大不超過64K。
在保護模式下,80386處理器可以使用所有的物理內(nèi)存。段基址可以是32位,也可以不是16的倍數(shù),同時它的最大長度為4G,這與8086完全不同,在形成邏輯地址時用段基址直接加上段內(nèi)偏移地址,而并不將段基址左移4位(乘以16)。通常情況下,除了訪問堆棧外,默認的段都為DS,有跨段前綴就另當(dāng)別論了。在以BP,EBP,ESP作為基址寄存器時,這時默認的段寄存器應(yīng)該是SS,舉幾個簡單的例子:
MOV EAX,[SI];這里的段寄存器是DS
MOV EAX,FS:[ESI];這里的段寄存器是FS,因為指令中使用跨段前綴顯示指定了
MOV EAX,[BP];這里的段寄存器是SS,因為指令中使用了BP作為基址寄存器
MOV EAX,GS:[BP];這里段寄存器是GS,因為指令中使用跨段前綴顯示指定了
80386中32位數(shù)的操作的順序是“高高低低”,即是說高16-》高16,高8-》高8,低16-》低16,低8-》低8,這和8086相似。同時80386微處理器兼容所有8086的尋址方式,而且對8086的尋址方式有很大的改進和擴展。在8086下,只允許BP,BX,SI,DI作為尋址寄存器,但在80386下,8個通用寄存器都可以作為尋址寄存器。不過有一點要注意的是在基址變址寄存器尋址方式或相對基址變址尋址方式中,段寄存器由基址寄存器來確定,而不是由變址寄存器來確定,同時除ESP外其它的7個通用寄存器都可以作為變址寄存器,用代碼來表示就是:
MOV EAX,[EBP+ESP+2];這條指令是錯誤的,因為不可以用ESP作為變址寄存器
MOV EAX,[EBP+ESI+10H];這里的段寄存器應(yīng)該有基址寄存器來決定?;芳拇嫫魇荁P,那么這里的段寄存就是SS
MOV EAX,GS:[EBP+EDI+100H];不用看了,這里的段寄存器應(yīng)該是GS,因為指令通過跨段前綴顯示指定了
80386支持的基地址+變址+位移量尋址進一步滿足了高級語言支持的數(shù)據(jù)類型。對于C語言來講,普通變量,數(shù)組,結(jié)構(gòu)體,結(jié)構(gòu)體的數(shù)組,數(shù)組的構(gòu)體我們既可存放在棧中(靜態(tài)定義-static definition),也可以存放在堆中(動態(tài)定義-dynamic definition),用ASM也一樣可以實現(xiàn)?;纷冎芳拇嫫魈峁┝藘蓚€可以改變的部分,而位移量則是靜態(tài)的。看下面的例子:
//Variables in C Programming-Language,the corresponding ASM will list below
void main()
{
int a;//普通的變量,用ASM尋址時直接用DS:[一位移量],如DS:[2000],屬于直接尋址方式
int array[24];//數(shù)組,用ASM尋址時用DS:[BX+SI*4],4表示整型的長度,屬于基址變址尋址方式
struct abc
{
int a,b,c;
float d;
};
struct abc aa;//結(jié)構(gòu)體,用ASM尋址時DS:[BX+Shift],Shift代表位移量,屬于寄存器相對尋址方式
struct abc aa[100];//結(jié)構(gòu)體數(shù)組,用ASM尋址時用DS:[BX+SI*sizeof(abc)+Shift],屬于相對基址變址尋址方式
struct cde
{
int array[100];
float e,f,g;
};
struct cde ccc;//數(shù)組結(jié)構(gòu)體,用ASM尋址時用DS:[BX+SI*4+Shift],屬于相對基址變址尋址方式
}
80386與8086的尋址方式差不多完全一樣,只不過80386的尋址方式更靈活,它的操作數(shù)有32位,16位,8位。
讓我們再重溫一下8086的尋址方式:
a.立即尋址,所謂立即尋址就是操作數(shù)就在指令中,比如說:MOV AX,5678H
b.直接尋址,即直接包含操作數(shù)的有效地址EA,比如說MOV AX,[1234]
c.寄存器間址尋址,用寄存器的內(nèi)容來作為操作數(shù)的有效地址,比如說SI=1234,MOV AX,[SI],8086下可用的寄存器只有4個:BX,BP,SI,DI,80386下8個通用的寄存器都可以使用。
d.寄存器相對尋址,即在寄存器間址尋址方式的基礎(chǔ)上再加一個位移量,位移量可以是8位也可以是16位,比如說MOV AX,[BX+90H]。
e.基址變址尋址,即操作數(shù)的有效地址由一基址寄存器和一變址寄存器產(chǎn)生,如MOV AX,[BX+SI]。那么在8086下,只有SI,DI可以作為變址寄存器,在80386下除ESP外的其它7個通用寄存器都可以作為變址寄存器,比如說MOV AX,[BX+SI]。
f.相對基址變址尋址,在e尋址方式的基礎(chǔ)上加上一位移量,比如說MOV AX,[BX+SI+100H]。
在8086下,我們?nèi)邕M行字節(jié)或字操作,往往要加上偽指令WORD PTR或BYTE PTR。在80386下不用顯示指定,處理器會自動處理,當(dāng)發(fā)現(xiàn)目的操作為8位時,處理器就會進行8位操作,同理當(dāng)發(fā)現(xiàn)目的操作為16位,處理器就會進行16位操作,80386下以目的操作數(shù)的長度為準(zhǔn),以下幾條簡單的傳送指令:
MOV AL,CS:[EAX];8位操作,段寄存器是CS,尋址方式是寄存器間址尋址
MOV AL,ES:[BX];8位操作,段寄存器是ES,尋址方式是寄存器間址尋址
MOV EDX,[EDX+EBX+1234H];32位操作,段寄存器是DS,尋址方式是相對基址變址尋址
MOV AX,[EBX+ESI*4];16位操作,段寄存器是DS,尋址方式是基址變址尋址
MOV BH,ES:[EBX+EDI+900H];8位操作,段寄存器是ES,尋址方式是相對基址變址尋址
MOV DL,[EBP+ESI+1900H];8位操作,段寄存是SS,因為用了EBP作為基址寄存器。尋址方式是相對基址變址尋址
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。