指令格式
1.指令的書寫格式
標號: 指令助記符 操作數 ; 註釋
2.操作數的3種形式:
立即操作數:指令的操作數是立即數,並直接出現在指令中。
寄存器操作數:操作數是寄存器的值,指令中使用寄存器名。
內存操作數:操作數是某個內存單元的值,指令中給出有效地址EA,段地址在某個段寄存器中。
1.立即數: 8位或16位立即數。
2.寄存器操作數:
8位/16位通用寄存器和段寄存器(除了FS和GS)。
3.內存操作數
包括下列幾種形式。
Variable 或 [Variable]
[reg]
disp[reg]
[base][index]
disp[base][index]
?***說明:
Variable是變量名或變量名 ± 整數表達式。
reg爲BX、BP、SI、DI。
disp可以是常量或變量,彙編後爲一個常數,若是變量,則取其偏移地址。
base爲BX或BP,index爲SI或DI。
有效地址爲各項之和。如disp[base][index]形式,EA = base + index + disp。
若使用了BP,則隱含段地址在SS,否則在DS。
當段地址不在隱含的段寄存器時,可使用段超越前綴,形式爲:段寄存器名:
1.立即數: 32位立即數。
2.寄存器操作數: 32位通用寄存器以及FS和GS。
3.內存操作數
包括下列幾種形式。
[base]
disp[base]
[base][index]
disp[base][index]
[index*n]
disp[index*n]
[base][index*n]
disp[base][index*n]
***說明:
base、index爲任一32位通用寄存器(index不能取ESP)。
n爲比例因子,取1、2、4或8。
若包含base且base爲EBP或ESP,則隱含段地址在SS;否則,隱含段地址在DS。
若在16位CPU上編程,則不能使用這些尋址方式。
爲了描述方便,採用下列符號約定:
dest — 目的操作數
src — 源操作數
oprdn — 第n個操作數,如oprd1, oprd2, oprd3
= — 賦值
/ — 或者
reg8 — 8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL
reg16 — 16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SP
reg32 — 32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP
reg — reg8/reg16/reg32
seg — 段寄存器CS/DS/SS/ES/FS/GS
mem8 — 8位內存操作數
mem16 — 16位內存操作數
mem32 — 32位內存操作數
mem — mem8/mem16/mem32
mem64 — 64位內存操作數
imm8 — 8位立即數
imm16 — 16位立即數
imm32 — 32位立即數
imm — imm8/imm16/imm32
1. MOV ( Move ):傳送
一般形式:
MOV dest, src ; dest = src。將源操作數src複製到目的操作數dest,src不變。
語法格式:
MOV reg/mem/seg, reg/mem/seg/imm
對標誌位的影響:無。
說明:
dest與src不能作如下搭配:
MOV mem, mem ; 錯誤
MOV seg, seg ; 錯誤
MOV seg, imm ; 錯誤
dest不能是CS。
dest與src必須類型匹配,即同時是字節、字或雙字類型。
2. XCHG ( Exchange ):交換
一般形式:
XCHG oprd1, oprd2 ; 交換oprd1與oprd2的內容
語法格式:
XCHG reg/mem, reg/mem
對標誌位的影響:無。
說明:
oprd1與oprd2不能作如下搭配:
XCHG mem, mem ; 錯誤
oprd1與oprd2類型必須匹配。、
【例】
xchg ebx, edx
xchg [ebp][eax*4], edx
3. LEA (Load Effective Address ) :裝入有效地址
語法格式:
LEA reg16, mem ; reg16 = mem的有效地址
對標誌位的影響:無。
【例】設BX = 5678H,EAX = 1,EDX = 2。
lea si, 2[bx] ; 執行後,SI = 567AH
lea si, 2[eax][edx] ; 執行後,SI = 5
4. LDS、LES
語法格式:
LDS reg16, mem32 ; reg16 = mem32的低字,DS = mem32的高字
LES reg16, mem32 ; reg16 = mem32的低字,ES = mem32的高字
對標誌位的影響:無。
5. 堆棧操作指令
80x86系統的堆棧具有如下特點:
堆棧是在內存的堆棧段中,具有“先進後出”的特點。
堆棧只有一個出入口,即當前棧頂。當堆棧爲空時,棧頂和棧底指向同一內存單元。
堆棧有兩個基本操作:PUSH(進棧)和POP(出棧)。PUSH操作使棧頂向低地址方向移動,而POP操作則剛好相反。
堆棧操作只能以字或雙字爲單位。
SS:SP指向棧頂。
(1)PUSH與POP:進棧與出棧
語法格式:
PUSH reg16/seg/mem16/ reg32/mem32
POP reg16/seg/mem16/ reg32/mem32 ; 操作數不能是CS
PUSH imm ; 286新增
功能描述:
PUSH指令(16位):
SP = SP - 2
SS:[SP] = 16位操作數
POP指令(16位):
16位操作數 = SS:[SP]
SP = SP + 2
PUSH指令(32位):
SP = SP - 4
SS:[SP] = 32位操作數
POP指令(32位):
32位操作數 = SS:[SP]
SP = SP + 4
對標誌位的影響:無。
(2)PUSHF與POPF:標誌寄存器進棧和出棧
語法格式:
PUSHF ; FLAGS進棧
POPF ; 棧頂字出棧到FLAGS
對標誌位的影響:只有POPF指令會以彈出值設置標誌寄存器。
【例】設SP = 100H, EBX = 12345678H, 給出下列指令依次執行後的結果。
push bx ; ss:[00ffh] = 56h, ss:[00feh] = 78h, sp = 0feh
pop ax ; ax = 5678h, sp = 100h
push ebx ; ss:[00feh] = 1234h, ss:[00fch] = 5678h, sp = 0fch
pop ax ; ax = 5678h, sp = 0feh
pop ax ; ax = 1234h, sp = 100h
【例】交換AX與CX的值。
push ax
push cx
pop ax
pop cx
6. 標誌寄存器傳送指令
(1)LAHF(Load AH from Flags)
語法格式:
LAHF ; AH = FLAGS的低8位
對標誌位的影響:無。
?
(2)SAHF(Store AH into Flags)
語法格式:
SAHF ; FLAGS的低8位 = AH
對標誌位的影響:由新裝入值確定。
符號擴展與零擴展指令
(1)CBW、CWD、CWDE與CDQ
語法格式:
CBW ; AL符號擴展爲AX
CWD ; AX符號擴展爲32位數DX:AX
CWDE ; AX符號擴展爲EAX;386新增
CDQ ; EAX符號擴展爲64位數EDX:EAX;386新增
【例】設AL = 0FEH,給出依次執行下列指令後的結果。
cbw ; ax = 0fffeh
cwd ; dx = 0ffffh, ax不變,即dx:ax = -2
cwde ; eax = 0fffffffeh(-2)
cdq ; edx = 0ffffffffh, eax不變,即edx:eax = -2
(2)MOVSX
一般形式:
MOVSX dest, src ; src符號擴展爲dest;386新增
語法格式:
MOVSX reg16, reg8/mem8
MOVSX reg32, reg8/mem8/reg16/mem16
功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用來將8位數符號擴展爲16位或32位數,或者將16位數符號擴展爲32位數。
【例】 CBW和CWDE的功能可由MOVSX指令實現。
movsx ax, al ; 等價於cbw
movsx eax, ax ; 等價於cwde
movsx eax, al ; 等價於順序執行cbw與cwde
(3)MOVZX
一般形式:
MOVZX dest, src ; src零擴展爲dest;386新增
語法格式:
MOVZX reg16, reg8/mem8
MOVZX reg32, reg8/mem8/reg16/mem16
8. XLAT(Translate):換碼
語法格式:
XLAT ; AL = DS:[ BX +AL ]
功能描述:將DS:BX所指內存區中、由AL指定位移處的一個字節賦給AL。
對標誌位的影響:無。
算術指令
1. 加法
一般形式:
ADD dest, src ; dest = dest + src
ADC dest, src ; dest = dest + src + CF
INC dest ; dest = dest + 1
語法格式:
ADD reg/mem, reg/mem/imm
ADC reg/mem, reg/mem/imm
INC reg/mem
對標誌位的影響:
ADD、ADC:按一般規則影響CF、OF、SF和ZF。
INC:不影響CF,其它同ADD。
說明:ADD與ADC的2個操作數必須類型匹配,且不能同時是內存操作數。
2. 減法
一般形式:
SUB dest, src ; dest = dest – src
SBB dest, src ; dest = dest - src – CF
CMP dest, src ; dest – src。 與SUB的區別在於,不將減法結果存入dest。
DEC dest ; dest = dest - 1
NEG dest ; dest = 0 – dest
語法格式:
SUB reg/mem, reg/mem/imm
SBB reg/mem, reg/mem/imm
CMP reg/mem, reg/mem/imm
DEC reg/mem
NEG reg/mem
對標誌位的影響:
SUB、SBB、CMP、NEG:按一般規則影響CF、OF、SF和ZF。CF表示借位。
DEC:不影響CF,其它同SUB。
說明:2個操作數必須類型匹配,且不能同時是內存操作數。
3. 乘法
(1)MUL(Unsigned Multiplication):無符號乘法
一般形式:
MUL src
語法格式:
MUL reg8/mem8 ; AX = AL × src
MUL reg16/mem16 ; DX:AX = AX × src
MUL reg32/mem32 : EDX:EAX = EAX × src
對標誌位的影響:若8位×8位、16位×16位或32位×32位的結果分別能由8、16或32位容納(即結果的高一半爲0),則CF = OF = 0,否則,CF = OF = 1;其餘標誌無定義。
說明:由於2個n位數的乘積可能需要2n位,因此,若操作數是8位,則結果爲16位;同樣,16位操作數相乘結果爲32位,32位數相乘結果爲64位。
(2)IMUL(Integer Multiplication):帶符號乘法
一般形式:
IMUL src
語法格式:
IMUL reg8/mem8 ; AX = AL × src。執行帶符號乘法,下同。
IMUL reg16/mem16 ; DX:AX = AX × src
IMUL reg32/mem32 : EDX:EAX = EAX × src
對標誌位的影響:若結果的高一半爲低一半的符號擴展,則CF = OF = 0,否則,CF = OF = 1;其餘標誌無定義。
說明:由於2個n位數的乘積可能需要2n位,因此,若操作數是8位,則結果爲16位;同樣,16位操作數相乘結果爲32位,32位數相乘結果爲64位。
【例】對於同一個二進制數,採用 MUL與IMUL執行的結果可能不同。設AL = 0FFH,BL = 1,分別執行下列指令,會得出不同結果。
mul bl ; ax = 0ffh(255)
imul bl ; ax = 0ffffh(-1)
4. 除法
一般形式:
DIV src ; 無符號數除法
IDIV src ; 帶符號數除法
語法格式:
DIV reg/mem
IDIV reg/mem
功能描述:
src是8位:AX÷src,結果商在AL、餘數在AH。
src是16位:DX:AX÷src,結果商在AX、餘數在DX。
src是32位:EDX:EAX÷src,結果商在EAX、餘數在EDX。
對標誌位的影響:無定義。
5.十進制調整指令
(1)壓縮BCD碼調整指令
語法格式:
DAA ; 調整AL中的和爲壓縮BCD碼
DAS ; 調整AL中的差爲壓縮BCD碼
功能描述:
DAA:通常先執行ADD/ADC指令,將2個壓縮BCD碼相加,結果存放在AL中。然後使用該指令將AL調整爲壓縮BCD碼格式。
DAS:通常先執行SUB/SBB指令,將2個壓縮BCD碼相減,結果存放在AL中。然後使用該指令將AL調整爲壓縮BCD碼格式。
對標誌位的影響:OF不確定;CF反映壓縮BCD碼相加/相減的進位/借位狀態;按一般規則影響SF和ZF。
說明:若使用DAA/DAS指令,則參加加法/減法運算的操作數應該是壓縮BCD碼。如果將任意2個二進制數相加/減,然後調整,將得不到正確結果。
DAA的調整算法如下:
if ( AL低4位 > 9 或 AF = 1) then
AL = AL + 6;
AF = 1 ;
endif
if ( AL高4位 > 9 或 CF = 1 ) then
AL = AL + 60H;
CF = 1;
endif
DAS的調整算法如下:
if ( AL低4位 > 9 或 AF = 1 ) then
AL = AL – 6;
AF = 1;
endif
if ( AL高4位 > 9 或 CF = 1 ) then
AL = AL - 60h;
CF = 1;
endif
(2)非壓縮BCD碼調整指令
語法格式:
AAA ; 調整AL中的和爲非壓縮BCD碼
; 調整後,AL高4位 = 0,AH = AH + 產生的CF
AAS ; 調整AL中的差爲非壓縮BCD碼
; 調整後,AL高4位 = 0,AH = AH - 產生的CF
AAM ; AH = AX div 10,AL = AX mod 10
AAD ; AL = AH × 10 + AL,AH = 0
功能描述:
AAA:通常先執行ADD/ADC指令,以AL爲目的操作數,將2個非壓縮BCD碼(高4位無關)相加。然後使用AAA將AL調整爲非壓縮BCD碼格式,且高4位 = 0,同時將調整產生的進位加到AH中。
AAS:通常先執行SUB/SBB指令,以AL爲目的操作數,將2個非壓縮BCD碼(高4位無關)相減。然後使用AAS將AL調整爲非壓縮BCD碼格式,且高4位 = 0,同時將調整產生的借位從AH中減去。
AAM與AAD:略。
對標誌位的影響:
AAA與AAS:CF反映非壓縮BCD碼加/減的進位/借位;OF、SF和ZF不確定。
AAA的調整算法如下:
if ( AL低4位 > 9 或 AF = 1 ) then
AL = AL + 6;
AH = AH + 1;
AF = 1;
CF = 1;
else
AF = 0;
CF = 0;
endif
AL = AL AND 0FH ; AL高4位清0
AAS的調整算法如下:
if ( AL低4位 > 9 或 AF = 1) then
AL = AL – 6;
AH = AH – 1;
AF = 1;
CF = 1;
else
AF = 0;
CF = 0;
endif
AL = AL AND 0FH ; AL高4位清0