1. 程式人生 > >80x86彙編指令詳解

80x86彙編指令詳解

80x86指令系統,指令按功能可分為以下七個部分。
  (1) 資料傳送指令。
  (2) 算術運算指令。
  (3) 邏輯運算指令。
  (4) 串操作指令。
  (5) 控制轉移指令。
  (6) 處理器控制指令。
  (7) 保護方式指令。
  3.3.1資料傳送指令
  資料傳送指令包括:通用資料傳送指令、地址傳送指令、標誌暫存器傳送指令、符號擴充套件指令、擴充套件傳送指令等。
  一、通用資料傳送指令
  1 傳送指令
  傳送指令是使用最頻繁的指令,格式:MOV DEST,SRC
  功能:把一個位元組,字或雙字從源運算元SRC傳送至目的運算元DEST。
  傳送指令允許的資料流方向見圖3 11。

80x86彙編指令詳解 - zhaofuguang - zhaofuguang的部落格

圖 3.11  傳送指令資料流

  由上圖可知,資料允許流動方向為:通用暫存器之間、通用暫存器和儲存器之間、通用暫存器和段暫存器之間、段暫存器和儲存器之間,另外還允許立即數傳送至通用暫存器或儲存器。但在上述傳送過程中,段暫存器CS的值不能用傳送指令改變。
  例 3.12CPU內部暫存器之間的資料傳送。
  MOV AL,DH    ;AL←DH    (8位)
  MOV DS,AX    ;DS←AX    (16位)
  MOV EAX,ESI   ;EAX←ESI   (32位)
  例 3.13CPU內部暫存器和儲存器之間的資料傳送。
  MOV [BX],AX       ;間接定址     (16位)
  MOV EAX,[EBX+ESI]   ;基址變址定址   (32位)
  MOV AL,BLOCK      ;BLOCK為變數名,直接定址(8位)
例 3.14

立即數送通用暫存器、儲存器。
  MOV EAX,12345678H   ;EAX←12345678H   (32位)
  MOV [BX],12H      ;間接定址      (8位)
  MOV AX,1234H;AX←1234H(16位)
  使用該指令應注意以下問題:
  ·源和目的運算元不允許同時為儲存器運算元;
  ·源和目的運算元資料型別必須一致;
  ·源和目的運算元不允許同時為段暫存器;
  ·目的運算元不允許為CS和立即數;
  ·當源運算元為立即數時,目的運算元不允許為段暫存器;
  ·傳送操作不影響標誌位。
  2 擴充套件傳送指令
  格式:MOV SX DEST,SRC
     MOV ZX DEST,SRC
  功能:將源運算元由8位擴充套件到16位送目的運算元,或由16位擴充套件到32位送目的運算元。其中MOVSX是按有符號數擴充套件,MOVZX是按無符號數擴充套件。無符號數或正數高位擴充套件為0,負數高位擴充套件為全“1”。
  例 3.15
帶符號數擴充套件
  MOV BL,80H  ; -128
  MOVSX AX,BL  ; 將80H擴充套件為FF80H後送AX中。
  例 3.16無符號數擴充套件
  MOV BL,80H  ; 128
  MOVZX AX,BL  ; 將80H擴充套件為0080H後送AX中。
  使用該指令應注意以下問題:
  ·目的運算元應為16位或32位通用暫存器;
  ·源運算元長度須小於目的運算元長度,為8位或16位通用暫存器或儲存器運算元;
  ·擴充套件傳送操作不影響標誌位。
  3 交換指令
  (1) 格式:XCHG OPR1,OPR2
  功能:交換運算元OPR1和OPR2的值,運算元資料型別為位元組、字或雙字。允許通用暫存器之間,通用暫存器和儲存器之間交換資料。
  例 3.17
  XCHG AX,BX;通用暫存器之間交換資料(16位)
  XCHG ESI,EDI;通用暫存器之間交換資料(32位)
  XCHG BX,

SI SI ;通用暫存器和儲存器之間交換資料(16位)
  XCHG AL, BX BX ;通用暫存器和儲存器之間交換資料(8位)
  使用該指令應注意以下問題:
  ·運算元OPR1和OPR2不允許同為儲存器運算元;
  ·運算元資料型別必須一致;
  ·交換指令不影響標誌位。
  如要實現儲存器運算元交換,可用如下指令實現:
               MOV AL,BLOCK1
               XCHG AL,BLOCK2
               MOV BLOCK1,AL
  (2) 格式:BSWAP REG
  功能:將32位通用暫存器中,第1個位元組和第4個位元組交換,第2個位元組和第3個位元組交換。
例 3.18
  MOV EAX,44332211H
  BSWAP EAX;EAX=11223344H
  使用該指令應注意以下問題:
  ·運算元為32位通用暫存器;
  ·交換指令不影響標誌位。
   二、堆疊操作指令
   1 壓棧指令
  (1) 格式:PUSH SRC
  功能:將源運算元壓下堆疊,源運算元允許為16位或32位通用暫存器、儲存器和立即數以及16位段暫存器。當運算元資料型別為字型別,壓棧操作使SP值減2;當資料型別為雙字型別,壓棧操作使SP值減4。
  例 3.19
  PUSH AX          ;通用暫存器運算元入棧(16位)
  PUSH EBX          ;通用暫存器運算元入棧(32位)
  PUSH [SI]         ;儲存器運算元入棧(16位)
  PUSH DWORD PTR [DI]    ;儲存器運算元入棧(32位)
  PUSHW 0A123H        ;立即數入棧(16位)
  PUSHD 20H         ;立即數入棧(32位)
  (2) 格式:PUSHA
       PUSHAD
  功能:PUSHA將16位通用暫存器壓入堆疊,壓棧順序為AX,CX,DX,BX,SP,BP,SI,DI。
PUSHAD將32位通用暫存器壓入堆疊,壓棧順序為EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
   2 出棧指令
  (1) 格式:POP DEST
  功能:從棧頂彈出運算元送入目的運算元。目的運算元允許為16或32位通用暫存器、儲存器和16位段暫存器。當運算元資料型別為字型別,出棧操作使SP加2;當運算元資料型別為雙字型別,出棧操作使SP加4。
   例 3.20
  POP AX          ;操作數出棧送暫存器(16位)
  POP ECX          ;操作數出棧送暫存器(32位)
  POP [BX]         ;操作數出棧送儲存器(16位)
  POP DWORD PTR [SI]    ;操作數出棧送儲存器(32位)
  (2) 格式:POPA
       POPAD
  功能:POPA從堆疊移出16位元組資料,並且按順序存入暫存器DI,SI,BP,SP,BX,DX,CX,AX中。
  POPAD從堆疊移出32位元組資料,並且按順序存入暫存器EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中。
  使用堆疊操作指令應注意以下問題。
  (1) 目的運算元不允許為CS以及立即數。
  (2) 堆疊操作指令不影響標誌位。
   三、地址傳送指令
  (1) 格式:LEA REG,MEM
  功能:將源運算元的有效地址傳送到通用暫存器,運算元REG為16位或32位通用暫存器,源運算元為16位或32位儲存器運算元。
  例 3.21
  LEA BX,BLOCK;將BLOCK的有效地址傳送到BX中(16位)
  LEA EAX, EBX EBX ;將EBX內容(有效地址)傳送到EAX中(32位)
  (2) 格式LDS(ES,FS,GS,SS)REG,MEM
  功能:根據源運算元指定的偏移地址,在資料段中取出段地址和偏移地址分別送指定的段暫存器和指定的通用暫存器。
  例 3.22
  LES BX,[SI]        ;將32位地址指標分別送ES和BX
  LSS EAX,[EDI]       ;將48位地址指標分別送SS和EAX
    80x86彙編指令詳解 - zhaofuguang - zhaofuguang的部落格
  例 3.23
  DATA1  DD buff
    80x86彙編指令詳解 - zhaofuguang - zhaofuguang的部落格
  LDS BX,DATA1;將buff的32位地址指標分別送DS和BX
    80x86彙編指令詳解 - zhaofuguang - zhaofuguang的部落格
地址傳送指令對標誌位無影響。
   四、標誌暫存器傳送指令
  (1) 格式:LAHF
       SAHF
  功能:LAHF將標誌暫存器中低8位送AH中。SAHF將AH中內容送標誌暫存器中低8位。
  (2) 格式:PUSHF
       POPF
  功能:PUSHF將標誌暫存器低16位內容壓入堆疊,SP←SP-2。POPF將當前棧頂一個字傳送到標誌暫存器低16位中,SP←SP+2。
  (3) 格式:PUSHFD
       POPFD
  功能:PUSHFD將標誌暫存器32位內容壓入堆疊SP←SP-4。POPFD將當前棧頂一個雙字傳送到32位標誌暫存器中,SP←SP+4。
  上述SAHF,POPF,POPFD均影響相應的標誌暫存器內容。
   五、查表指令
  格式:XLAT
  功能:將暫存器AL中的內容轉換成儲存器表格中的對應值。實現直接查表功能。
  XLAT指令規定:BX暫存器存放表的首地址,AL暫存器中存放表內偏移量,執行XLAT指令,以段暫存器DS的內容為段基址,有效地址為BX和AL內容之和,取出表中一個位元組內容送AL中。
   例 3.24記憶體中有一起始地址為TABLE的編碼表,試程式設計將表中順序號為4的儲存單元內容送暫存器AL。
         ·MODEL SMALL
         ·DATA
  TABLE      DB 11H,22H,33H,44H,55H 某編碼表
         ·CODE
         ·STARTUP
          MOV AL,4           ;AL←4
          MOV BX,OFFSET TABLE     ;BX←TABLE表首地址
          XLAT             ;結果在AL中,AL=55H
         ·EXIT
          END
  查表指令不影響標誌位。
   六、符號擴充套件指令
  (1) 格式:CBW
  功能:將AL中8位帶符號數,進行帶符號擴充套件為16位,送AX中。帶符號擴充套件是指對正數高位擴充套件為全“0”,對負數高位擴充套件為全“1”。
  例 3.25AL=55H 經CBW擴充套件後 AX=0055H
      AL=A5H 經CBW擴充套件後 AX=FFA5H
  (2) 格式:CWD
  功能:將AX中16位帶符號數,進行帶符號擴充套件為32位,送DX和AX中。高16位送DX中,低16位送AX中。
  (3) 格式:CWDE
  功能:將AX中16位帶符號數,進行帶符號擴充套件為32位,送EAX中。
  (4) 格式:CDQ
  功能:將EAX中32位帶符號數,進行帶符號擴充套件為64位,送EDX和EAX中。低32位送EAX中,高32位送EDX中。
  符號擴充套件指令對標誌位無影響。
  3.3.2 算術運算指令
  80x86指令包括加、減、乘、除四種基本算術運算操作及十進位制算術運算調整指令。二進位制加、減法指令,帶符號運算元採用補碼錶示時,無符號數和帶符號資料運算可以使用相同的指令。二進位制乘、除法指令分帶符號數和無符號數運算指令。
   一、加法指令
  格式:ADDDEST,SRC
     ADCDEST,SRC
  功能:ADD是將源運算元與目的運算元相加,結果傳送到目的運算元。ADC是將源運算元與目的運算元以及CF(低位進位)值相加,結果傳送到目的運算元。
  源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
ADD,ADC指令影響標誌位為OF,SF,ZF,AF,PF,CF。
  例 3.26
  MOV AX,9876H
  ADD AH,AL;AX=0E76H CF=1 SF=0O F=0 ZF=0 AF=0 PF=0
  ADC AH,AL;AX=8576H CF=0 SF=1O F=1 ZF=0 AF=1 PF=0
   二、減法指令
  格式:SUB DEST,SRC
     SBB DEST,SRC
  功能:SUB將目的運算元減源運算元,結果送目的運算元。SBB將目的運算元減源運算元,還要減CF(低位借位)值,結果送目的運算元。
  源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
SUB,SBB指令影響標誌位為OF,SF,ZF,AF,PF,CF。
  例 3.27
  MOV AX, 9966H;AX=9966H
  SUB AL, 80H;AL=E6HCF=1SF=1OF=1ZF=0AF=0PF=0
  SBB AH, 80H;AH=18HCF=0SF=0OF=0ZF=0AF=0PF=1
   三、加1減1指令
  格式:INC DEST
     DEC DEST
  功能:INC指令將目的運算元加1,結果送目的運算元。DEC指令將目的運算元減1,結果送目的運算元。目的運算元為通用暫存器或儲存器運算元。
  INC,DEC指令影響標誌位為OF,SF,ZF,AF,PF。
  例 3.28
  INC BL;BL←BL+1
  INC AX;AX←AX+1
  INC WORDPTR [BX];儲存器運算元加1
  DEC BYTE PTR [SI];儲存器運算元減1
  DEC EAX;EAX←EAX-1
   四、比較指令
  (1) 格式:CMP DEST,SRC
  功能:目的運算元減源運算元,結果不回送。源運算元為通用暫存器、儲存器和立即數。目的運算元為通用暫存器、儲存器運算元。
  CMP指令影響標誌位為OF,SF,ZF,AF,PF,CF。
  例 3.29
  CMP CX,3
  CMP WORD PTR [SI],3
  CMP AX,BLOCK
  執行比較指令後,對狀態標誌位影響見表3.2。對於兩個數的比較(AX-BX)有以下3種情況。

表 3.2 CMP指令對標誌位的影響

80x86彙編指令詳解 - zhaofuguang - zhaofuguang的部落格


  · 兩個正數比較,使用SF標誌位判斷。
    SF=0,則AX≥BX,若ZF=1,則AX=BX
    SF=1,則AX<BX
  · 兩個無符號數比較,使用CF標誌位判斷。
    CF=0,則AX≥BX,若ZF=1,則AX=BX
    CF=1,則AX<BX
  · 兩個負數比較,使用SF標誌位判斷。
    SF=0,則AX≥BX,若ZF=1,則AX=BX
    SF=1,則AX<BX
  · 兩個異符號數比較。
    如果OF=0,仍可用SF標誌判斷大小。
    如果OF=1,說明結果的符號位發生錯誤,所以
         SF=0,則AX<BX
         SF=1,則AX>BX
  綜上所述:兩個異號數比較
  當OF=0,SF=0,則AX>BX
      SF=1,則AX<BX
  當OF=1,SF=0,則AX<BX
      SF=1,則AX>BX
  用邏輯表示式表示為:
  若OF∨-SF=0,則AX>BX
  若OF∨-SF=1,則AX<BX
  (2) 格式:CMPXCHGDEST,REG
  功能:目的運算元減源運算元,
    如果DEST=SRC,則SRC→DEST。
    如果DEST≠SRC,則DEST→ACC(AL,AX,EAX)。
  源運算元允許為通用暫存器。目的運算元可以為通用暫存器,儲存器運算元。
  CMPXCHG影響標誌位為OF,SF,ZF,AF,PF,CF。
  (3) 格式:CMPXCHG8BMEM
  功能:EDX:EAX中值減儲存器運算元。
    如果EDX:EAX=MEM64,則ECX:EBX→MEM64。
    如果EDX:EAX≠MEM64,則MEM64→EDX:EAX。
  該指令為64位比較交換指令,影響ZF標誌位。
  例 3.30  CMPXCHG8BQWORDPTR[EBX]
  五、交換相加指令
  格式:XADDDEST,REG
  功能:目的運算元加源運算元,結果送目的運算元。原目的運算元內容送源運算元。源運算元允許為通用暫存器。目的運算元允許為通用暫存器、儲存器運算元。
  XADD指令影響標誌位為OF,SF,ZF,AF,PF,CF。
  六、求補指令
  格式:NEGDEST
  功能:對目的運算元求補,用零減去目的運算元,結果送目的運算元。目的運算元為通用暫存器、儲存器運算元。
  NEG指令影響標誌位為OF,SF,ZF,AF,PF,CF。
  七、乘法指令
  (1) 格式:MULSRC
       IMULSRC
  功能:MUL為無符號數乘法指令,IMUL為帶符號數乘法指令。源運算元為通用暫存器或儲存器運算元。目的運算元預設存放在ACC(AL,AX,EAX)中,乘積存AX,DX:AX,EDX:EAX中。
  位元組乘:AL SRC→AX
  字乘:AX SRC→DX∶AX
  雙字乘:EAX SRC→EDX∶EAX
  MUL,IMUL指令執行後,CF=OF=0,表示乘積高位無有效資料;CF=OF=1表示乘積高位含有效資料,對其它標誌位無定義。
  例 3.31
  MUL BL;位元組乘
  MUL WORD PTR [SI];字乘
  IMUL BYTE PTR [DI];位元組乘
  IMUL DWORD PTR [ECX];雙字乘
  如果使用IMUL指令,積採用補碼形式表示。
  (2) 格式:IMULDEST,SRC
  功能:將目的運算元乘以源運算元,結果送目的運算元。目的運算元為16位或32位通用暫存器或儲存器運算元。源運算元為16位或32位通用暫存器、儲存器或立即數。
  源運算元和目的運算元資料型別要求一致。乘積僅取和目的運算元相同的位數,高位部分將被捨去,並且CF=OF=1。其它標誌位無定義。
  (3) 格式:IMUL DEST,SRC1,SRC2
  功能:將源運算元SRC1與源運算元SRC2相乘,結果送目的運算元。目的運算元DEST為16位或32位,允許為通用暫存器。源運算元SRC1為16位或32位通用暫存器或儲存器運算元。源運算元SRC2允許為立即數。
  例 3.32  IMULEAX,[EBX],12H
  要求目的運算元和源運算元SRC1型別相同,當乘積超出目的運算元部分,將被捨去,並且使CF=OF=1,在使用這類指令時,需在IMUL指令後加一條判斷溢位的指令,溢位時轉錯誤處理執行程式。
  八、除法指令
  格式:DIV SRC
     IDIV SRC
  功能:DIV為無符號數除法,IDIV為帶符號數除法。源運算元作為除數,為通用暫存器或儲存器運算元。被除數預設在目的運算元AX,DX:AX,EDX:EAX中。
  位元組除法:AX/SRC商→AL,餘數→AH
  字除法:DX·AX/SRC商→AX,餘數→DX
  雙字除法:EDX·EAX/SRC商→EAX,餘數→EDX
  由於被除數必須是除數的雙倍字長,一般應使用擴充套件指令進行高位擴充套件。當進行無符號數除法時,被除數高位按0擴充套件為雙倍除數字長。當進行有符號數除法時,被除數以補碼錶示。可使用擴充套件指令CBW,CWD,CWDE,CDQ進行高位擴充套件。例如:
  MOV AX,BLOCK
  CWD;被除數高位擴充套件
  MOV BX,1000H
  IDIV BX
  對於帶符號除法,其商和餘數均採用補碼形式表示,餘數與被除數同符號。當除數為零或商超過了規定資料型別所能表示的範圍時,將會出現溢位現象,產生一箇中斷型別碼為“0”的中斷。執行除法指令後標誌位無定義。
  九、BCD算術運算
  十進位制數在機器中採用BCD碼錶示,以壓縮格式存放,即一個位元組儲存2位BCD碼,BCD加減法是在二進位制加減運算的基礎上,對其二進位制結果進行調整,將結果調整成BCD碼錶示形式。

  (1) 格式:DAA
  功能:將存放在AL中的二進位制和數,調整為壓縮格式的BCD碼錶示形式。
  調整方法:若AL中低4位大於9或標誌AF=1(表示低4位向高4位有進位),則
         AL+6→AL,1→AF,
若AL中高4位大於9,或標誌CF=1,(表示高4位有進位),則
         AL+60H→AL,1→CF,
  DAA指令一般緊跟在ADD或ADC指令之後使用,影響標誌位為SF,ZF,AF,PF,CF。OF無定義。
  例 3.33
  ADD AL,BL
  DAA
  (2) 格式:DAS
  功能:將存放在AL中的二進位制差數,調整為壓縮的BCD碼錶示形式。
  調整方法:若AL中低4位大於9或標誌AF=1(表示低4位向高位借位),則
         AL-6→AL,1→AF
若AL中高4位大於9或標誌CF=1(表示高4位向高位借位),則
         AL-60H→AL,1→CF
  DAS指令一般緊跟在SUB或SBB指令之後使用,影響標誌位為SF,ZF,AF,PF,CF。OF無定義。
  例 3.34
  SUB AL,BL
  DAS
  十、ASCII算術運算
  數字0~9的ASCII碼為30H~39H,機器採用一個位元組存放一位ASCII碼,對於ASCII碼的算術運算是在二進位制運算基礎上進行調整。調整指令有加、減、乘、除四種調整指令。
  (1) 格式:AAA
  功能:將存放在AL中的二進位制和數,調整為ASCII碼錶示的結果。
  調整方法:若AL中低4位小於或等於9,僅AL中高4位清0,AF→CF。若AL中低4位大於9或標誌AF=1(進位),則AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。
  AAA指令一般緊跟在ADD或ADC指令之後使用,影響標誌位為AF,CF。其它標誌位無定義。
  例 3.35
  MOV AX,0036H
  ADD,AL,35H
  AAA;AX=0101H
  (2) 格式:AAS
  功能:將存放在AL中的二進位制差數,調整為ASCII碼錶示形式
  調整方法:若AL中低4位小於等於9,僅AL中高4位清0,AF→CF。若AL中低4位大於9或標誌AF=1,則AL-6→AL,AH-1→AH,1→AF,AF→CF,AL中高4位清0。
  AAS指令一般緊跟在SUB,SBB指令之後使用,影響標誌位為AF,CF。其它標誌位無定義。
  例 3.36
  MOV AX,0132H
  SUB AL,35H
  AAS;AX=0007H
  (3) 格式:AAM
  功能:將存放在AL中的二進位制積數,調整為ASCII碼錶示形式。
  調整方法:AL/10商→AH,餘數→AL
  AAM指令一般緊跟在MUL指令之後使用,影響標誌位為SF,ZF,PF。其它標誌位無定義。
  例 3.37
  MOV AL,07H
  MOV BL,09H
  MUL BL;AX=003FH
  AAM;AX=0603H
  (4) 格式:AAD
  功能:將AX中兩位非壓縮BCD碼(一個位元組存放一位BCD碼),轉換為二進位制數的表示形式。
  調整方法:AH 10+AL→AL0→AH
  AAD指令用於二進位制除法DIV操作之前,影響的標誌位為SF,ZF,PF。其它標誌位無定義。
  例 3.38
  MOV AX,0605H
  MOV BL,09H
  AAD;AX=0041H
  DIV BL;AX=0207H
  使用該類指令應注意,加法、減法和乘法調整指令都是緊跟在算術運算指令之後,將二進位制的運算結果調整為非壓縮BCD碼錶示形式,而除法調整指令必須放在除法指令之前進行,以避免除法出現錯誤的結果。
  使用算術運算類指令應注意:
  ·如果沒有特別規定,參與運算的兩個運算元資料型別必須一致,且只允許一個為儲存器運算元;
  ·如果參與運算的運算元只有一個,且為儲存器運算元,必須使用PTR偽指令說明資料型別;
  ·運算元不允許為段暫存器。
  ·目的運算元不允許為立即數;
  ·如果是儲存器定址,則儲存器各種定址方式均可使用。
  3.3.3邏輯運算指令
  一、邏輯指令
  1 邏輯與指令
  格式:AND DEST,SRC
  功能:目的運算元和源運算元按位進行邏輯與運算,結果存目的運算元中。源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
  例 3.39
  AND AL,BL
  AND EBX,ECX
  AND [DI],1101H
  AND指令常用於將運算元中某位清0(稱遮蔽),只須將要清0的位與0,其它不變的位與1即可。
  例 3.40  AND AL,0FH;將AL中高4位清0,低4位保持不變。
  AND指令影響標誌位為SF,ZF,PF,並且使OF=CF=0。
  2 邏輯或指令
  格式:OR DEST,SRC
  功能:目的運算元和源運算元按位進行邏輯或運算,結果存目的運算元中。源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
  例 3.41
  OR AX,BX
  OR ECX,[EAX]
  OR指令常用於將運算元中某位置1,只須將要置1的位或1,其它不改變的位或0即可。
  例 3.42  OR AL,80H;將AL中最高位置1。
  OR指令影響標誌位為SF,ZF,PF。並且使OF=CF=0。
  3 邏輯異或指令
  格式:XOR DEST,SRC
  功能:目的運算元和源運算元按位進行邏輯異或運算,結果送目的運算元。源運算元可以是通用暫存器、儲存器或立即數。目的運算元可以是通用暫存器或儲存器運算元。
  例 3.43
  XOR AX,BX
  XOR [BX],1010H
  XOR指令常用於將運算元中某些位取反,只須將要取反的位異或1,其它不改變的位異或0即可。
  例 3.44  XOR AL,OFH;將AL中低4位取反,高4位保持不變。
  XOR指令影響標誌位為SF,ZF,PF,並且使OF=CF=0。

  4 邏輯非指令
  格式:NOT DEST
  功能:對目的運算元按位取反,結果回送目的運算元。目的運算元可以為通用暫存器或儲存器。
  例 3.45
  NOT EAX
  NOT BYTE PTR [BX]
  NOT指令對標誌位無影響。
  5 測試指令
  格式:TEST DEST,SRC
  功能:目的運算元和源運算元按位進行邏輯與操作,結果不回送目的運算元。源運算元可以為通用暫存器、儲存器或立即數。目的運算元可以為通用暫存器或儲存器運算元。
  例 3.46
  TEST DWORD PTR [BX],80000000H
  TEST AL,CL
  TEST指令常用於測試運算元中某位是否為1,而且不會影響目的運算元。如果測試某位的狀態,對某位進行邏輯與1的運算,其它位邏輯與0,然後判斷標誌位。運算結果為0,ZF=1,表示被測試位為0;否則ZF=0,表示被測試位為1。
  例 3.47  TEST AL,80H;測試AL中最高位
        JNZ NEXT;如果最高位為1,轉到標誌NEXT處。
  TEST指令影響標誌位為SF,ZF,PF,並且使OF=CF=0。
  二、移位指令
  移位指令對運算元按某種方式左移或右移,移位位數可以由立即數直接給出,或由CL間接給出。移位指令分一般移位指令和迴圈移位指令。
  1 一般移位指令
  (1) 算術/邏輯左移指令。
  格式:SAL DEST,OPRD
     SHL DEST,OPRD
  功能:按照運算元OPRD規定的移位位數,對目的運算元進行左移操作,最高位移入CF中。每移動一位,右邊補一位0。如圖3 12(a)所示。目的運算元可以為通用暫存器或儲存器運算元。
  SAL,SHL指令影響標誌位OF,SF,ZF,PF,CF。

80x86彙編指令詳解 - zhaofuguang - zhaofuguang的部落格

圖 3.12  移位指令示意圖 


  例 3.48
  SHL BYTE PTR [DI],2
  SAL BX,CL
  (2) 算術右移指令。
  格式:SAR DEST,OPRD
  功能:按照運算元OPRD規定的移位次數,對目的運算元進行右移操作,最低位移至CF中,最高位(即符號位)保持不變。如圖3 12(b)所示。目的運算元可以為通用暫存器或儲存器運算元。
  SAR指令影響標誌位OF,SF,ZF,PF,CF。
  例 3.49
  SAR AL,5
  SAR WORD PTR

ECX ECX ,CL
  (3) 邏輯右移指令。
  格式:SHR DEST,SRC
  功能:按照運算元OPRD規定的移位位數,對目的運算元進行右移操作,最低位移至CF中。每移動一位,左邊補一位0。如圖3 12(c)所示,目的運算元可以為通用暫存器或儲存器運算元。
  SHR指令影響標誌位OF,SF,ZF,PF,CF。
  例 3.50
  SHR BYTE PTR [SI],3
  SHR EDX,CL
  算術/邏輯左移,只要結果未超出目的運算元所能表達的範圍,每左移一次相當於原數乘2。算術右移只要無溢位,每右移一次相當於原數除以2。
  2 迴圈移位指令
  格式:ROL DEST,OPRD
     ROR DEST,OPRD
     RCL DEST,OPRD
     RCR DEST,OPRD
  功能:迴圈左移指令ROL,見圖3 13(a)所示,目的運算元左移,每移位一次,其最高位移入最低位,同時最高位也移入進位標誌CF。迴圈右移指令 ROR見圖3 13(b)所示,目的運算元右移,每移位一次,其最低位移入最高位,同時最低位也移入進位標誌CF。
  帶進位迴圈左移指令RCL,見圖3 13(c)所示,目的運算元左移,每移動一次,其最高位移入進位標誌CF,CF移入最低位。帶進位迴圈右移指令 RCR,見圖3 13(d)所示,目的運算元右移,每移動一次,其最低位移入進位標誌CF,CF移入最高位。 80x86彙編指令詳解 - zhaofuguang - zhaofuguang的部落格

圖 3.13  迴圈移位指令

相關推薦

80x86彙編指令

80x86指令系統,指令按功能可分為以下七個部分。   (1) 資料傳送指令。   (2) 算術運算指令。   (3) 邏輯運算指令。   (4) 串操作指令。   (5) 控制轉移指令。   (6) 處理器控制指令。   (7) 保護方式指令。   3.3.1資料傳送指令   資料傳送指令包括:

彙編指令

1 為什麼要寫這篇部落格 雖然近些年嵌入式開發都使用C語言,但是涉及到很底層的實現的時候,還是得用匯編來實現。所以必須要掌握基本的彙編指令。本篇部落格意在講解一些常用到的彙編指令,算是一個成長積累的過程。後續遇到的彙編指令都會記錄到本部落格中。 2 常用匯編指令學習 2.1

專題3-ARM彙編指令

1、彙編概述 1)為什麼要學習使用匯程式設計序? bootloader在硬體初始化(啟動程式碼)時用的組合語言,因為效率更高。linux核心中某些對執行效率要特殊要求的地方也會使用匯編語言。 2)ARM彙編分類 目前常用的ARM彙編指令有兩種: (1)

x86彙編指令

80x86指令系統   80x86指令系統,指令按功能可分為以下七個部分。   (1) 資料傳送指令。   (2) 算術運算指令。   (3) 邏輯運算指令。   (4) 串操作指令。   (5) 控制轉移指令。   (6) 處理器控制指令。   (7) 保護方式指

angular 自定義指令 --restrict、restrict、replace

emp bold span 類型 ret space con 設置 註意 Angularjs 允許根據實際業務需要自定義指令, 通過angular全局對象下的 directive 方法實現。可以自定義屬性、自定義標簽、自定義功能 接下來定義一個名叫custom的指令,並利用

angular 自定義指令 Directive

聲明 其他 原型繼承 創建 tool 兩個 模板 變化 組合 廢話不多說,下面就直接上代碼 //angular指令的定義,myDirective ,使用駝峰命名法 angular.module(‘myApp‘, []) .directive(‘myDirective‘,

AngularJs自定義指令(5) - link

演示 hang cursor off drag font 雙向 事件 date 在指令中操作DOM,我們需要link參數,這參數要求聲明一個函數,稱之為鏈接函數。 寫法: link: function(scope, element, attrs) {  // 在這裏操作DO

angular指令--自定義指令

修飾 cor ring ttr 子元素 標簽 常用 文本 利用 自定義指令 directive()這個方法是用來定義指令的: angular.module(‘myApp‘, []) .directive(‘myDirective‘, function ($timeout,

cmake指令

後綴 符號鏈接 txt文件 之前 export 源文件 for offset pro 所需文件名:CmakeLists.txt,在需要操作的每個目錄下都需要 PROJECT(工程名字) 這條指令會自動創建兩個變量: <projectname>_BI

16位匯編第六講匯編指令第第三講

不變 無符號 目的 分享 class 邏輯移位 aam 但是 二進制      16位匯編第六講匯編指令詳解第第三講 1.十進制調整指令 1. 十進制數調整指令對二進制運算的結果進行十進制調

JVM指令(下)

詳解 函數 icm ble family oat lan dex 語句 九、自增減指令 該指令用於對本地(局部)變量進行自增減操作。該指令第一參數為本地變量的編號,第二個參數為自增減的數量。 比如對於代碼: int d=10; d

Redis中Key相關的常用指令

redis key vaule Redis是一個開源的使用ANSI C 語言編寫、支持網絡、同memcache相比在Redis下可以實現基於內存亦可持久化的日誌型、Key-Value 類型的NoSQL數據庫,且在Redis中Key的類型也更為豐富。所以較為廣泛的在生產環境中使用,在這裏就說一

Dockerfile中的COPY和ADD指令與比較

copy和add指令詳解與比較Dockerfile中的COPY指令和ADD指令都可以將主機上的資源復制或加入到容器鏡像中,都是在構建鏡像的過程中完成的。COPY指令和ADD指令的唯一區別在於是否支持從遠程URL獲取資源。COPY指令只能從執行docker build所在的主機上讀取資源並復制到鏡像中。而ADD

angularjs 指令

del 構造函數 單向 例如 正常 可選參數 詳解 href gif 一、指令定義 對於指令,可以把它簡單的理解成在特定DOM元素上運行的函數,指令可以擴展這個元素的功能。 首先來看個完整的參數示例再來詳細的介紹各個參數的作用及用法: <div my-directi

Angular JS 中 指令

scope [] 功能 spa fun table clas rest 方法 Angular JS的強大功能就在於其可以自定義很多指令,現在就指令做一下詳細的剖析。 一個Angular js 指令(directive)的生命周期 開始於$compile方法 結束於$link

vue內置指令——小白速會

ret 表單元 www. reverse 副本 用法 以及 erb handle 指令 (Directives) 是帶有 v- 前綴的特殊屬性,職責是,當表達式的值改變時,將其產生的連帶影響,響應式地作用於 DOM。 內置指令 1、v-bind:響應並更新DOM特性;例如:

Dockerfile 指令

art 直接 上下 復制 並不會 文件的 pan 環境變量 inter 使用Dockerfiledocker build [選項] <上下文路徑/URL/->其他構建方法直接用Git repo 進行構建用給定的tar壓縮包構建從標準輸入中讀取Dockerfile

java指令

語言 bpa group 缺省 windows ocl .bat instr 有一個 Java是通過java虛擬機來裝載和執行編譯文件(class文件)的,java虛擬機通過命令java option 來啟動,-option為虛擬機參數,通過這些參數可對虛擬機的運行狀態進行

3-3.8 Dockerfile 指令之二

上一篇文章介紹了Dockerfile指令詳解之一,包括: FROM 指定基礎映象 RUN 執行命令 COPY 複製檔案 ADD 更高階的複製檔案 CMD 容器啟動命令 ENTRYPOINT 入口點 ENV 設定環境變數 目錄 1. ARG 構建引數 2. VO