首先需要了解幾個內(nèi)容:
1、機器指令包含的兩部分:一部分是指令要完成的操作弃鸦,稱為指令操作碼部分;另一部分是參與操作的對象棕所,稱為操作數(shù)部分糊肠,可以直接給出操作數(shù)的值或操作數(shù)的地址信息辨宠。
2、有效地址(EA):處理器通過指令字提供的地址信息求出存放操作數(shù)的地址货裹,稱為有效地址嗤形。
尋址方式:查找操作數(shù)或求出操作數(shù)有效地址的方法,稱為尋址方式弧圆。
尋址有數(shù)據(jù)尋址和程序?qū)ぶ?/b>赋兵。
數(shù)據(jù)尋址方式主要有3大類:
操作數(shù)直接包含在指令中、包含在處理器某個內(nèi)部寄存器中搔预、包含在存儲器中霹期。
“操作數(shù)包含在存儲器中”的尋址方法,也可以稱為存儲器尋址方式斯撮,主要有9種经伙。
第一種:直接尋址方式
指令所要的操作數(shù)存放在內(nèi)存中扶叉,在指令中直接給出該操作數(shù)的有效地址稱為直接尋址方式勿锅。
通常情況下,操作數(shù)存放在數(shù)據(jù)段(DS)中(也可以顯式地指定其他段)枣氧,所以溢十,其線性地址將由數(shù)據(jù)段寄存器DS和指令中給出的有效地址直接形成,例如:
1达吞、INC WORD PTR [500H];
該指令的有效地址即偏移地址500H张弛。
線性地址=數(shù)據(jù)段基址(DS*16)+偏移地址(500H)
2、MOV AX, [2000H] ;
線性地址=數(shù)據(jù)段基址(DS*16)+偏移地址(2000H)
將有效地址(偏移地址)2000H字單元中的內(nèi)容傳送到AX寄存器中酪劫。
#1:如果使用段超越前綴吞鸭,那么,操作數(shù)可存放在其它段覆糟。
例如刻剥,要指定訪問其它段內(nèi)的數(shù)據(jù),可在指令中用段前綴的方式顯式地書寫出來滩字。
下面指令的目標操作數(shù)就是帶有段前綴的直接尋址方式造虏。
MOV ES:[1000H], AX
#2:中括號在指令中的區(qū)別
#2-0:立即數(shù)尋址方式和直接尋址方式:
寫在括號“[”,“]”內(nèi)的數(shù)值代表直接尋址的地址麦箍,沒有括號“[”漓藕,“]”代表立即數(shù)尋址的操作數(shù)。
mov eax,[2H] ? eax==(DS*16+2H)中的內(nèi)容傳送到AX寄存器中挟裂。
mov eax,2H ? ? ? ? eax==2H
#2-1:mov指令下的變量:
num dword 2
mov ebx,num ? ebx==2
mov ecx,[num] ?ecx==2
對于變量來說享钞,加不加中括號,都是取值而不是取地址诀蓉。
#2-2:mov指令下的寄存器:
mov ebx,eax ? ? ?ebx==eax
mov ecx,[eax] ?ecx==(DS*16+eax)中的內(nèi)容傳送到ecx寄存器中栗竖。如果eax的值過大寝姿,可能會報錯。
對于寄存器來說划滋,加中括號等于直接尋址饵筑。
#2-3:lea指令下的變量:
num dword 2 ? ?假設(shè)num地址是0x00574675
lea ebx,num ? ? ?ebx==0x00574675
lea eax,[num] ? ?eax==0x00574675
對于變量來說,加不加中括號处坪,都是取地址根资。
#2-4:lea指令下的寄存器:
mov eax,2
lea ebx,[eax] ? ? ebx==2
lea ebx,eax; 編譯器報錯: error A2070: invalid instruction operands
對于寄存器來說,加中括號是取寄存器中的值同窘,不加中括號會報錯玄帕。
3#:如果啟用了分頁機制,那么線性地址是邏輯地址和物理地址之間的中間層想邦。若沒有啟用分頁機制裤纹,那么線性地址就是物理地址。