彙編語言——80x86指令系統(一)

80x86指令系統

指令格式
1.指令的書寫格式
  標號: 指令助記符 操作數  ; 註釋
2.操作數的3種形式:
 立即操作數:指令的操作數是立即數,並直接出現在指令中。
 寄存器操作數:操作數是寄存器的值,指令中使用寄存器名。
 內存操作數:操作數是某個內存單元的值,指令中給出有效地址EA,段地址在某個段寄存器中。
8086指令的操作數形式
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。
    當段地址不在隱含的段寄存器時,可使用段超越前綴,形式爲:段寄存器名:
32位CPU擴展的操作數形式 
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章