x86匯編指令詳解


80x86指令系統

 


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

 

 

圖 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/];通用寄存器和存儲器之間交換數據(16位)
  XCHG AL,/[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內容(有效地址)傳送到EAX中(32位)
  (2) 格式LDS(ES,FS,GS,SS)REG,MEM
  功能:根據源操作數指定的偏移地址,在數據段中取出段地址和偏移地址分別送指定的段寄存器和指定的通用寄存器。
  例 3.22
  LES BX,[SI]        ;將32位地址指針分別送ES和BX
  LSS EAX,[EDI]       ;將48位地址指針分別送SS和EAX
   
  例 3.23
  DATA1  DD buff
   
  LDS BX,DATA1;將buff的32位地址指針分別送DS和BX
   
地址傳送指令對標志位無影響。
  四、標志寄存器傳送指令
  (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指令對標志位的影響

 

 


  · 兩個正數比較,使用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。

 

 

圖 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/],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移入最高位。

 

圖 3.13  循環移位指令

 


  目的操作數可以為通用寄存器或存儲器操作數。循環移位指令影響標志位CF,OF。其它標志位無定義。
  例 3.51
  ROL AL,CL
  ROR BX,5
  RCL ECX,3
  RCR BYTE PTR [SI],CL
  例 3.52  將一個2位數壓縮的BCD碼轉換成二進制數。
   ·MODEL SMALL
   ·DATA
  BCD DB 01011001B
  BIN DB?
    CODE
   ·START UP
    MOV AL,BCD
    MOV BL,AL
    AND BL,0FH
    AND AL,0F0H
    MOV CL,4
    ROR AL,CL
    MOV BH,0AH
    MUL BH
    ADD AL,BL
    MOV BIN,AL
   ·EXIT
    END
  3雙精度移位指令
  格式:SHLD DEST,SRC,OPRD
     SHRD DEST,SRC,OPRD
  功能:對於由目的操作數DEST和源操作數SRC構成的雙精度數,按照操作數OPRD給出的移位位數,進行移位。SHLD是對目的操作數進行左移,如 圖314(a)所示,SHRD是對目的操作數進行右移,如圖314(b)所示。先移出位送標志位CF,另一端空出位由SRC移入DEST中,而SRC 內容保持不變。目的操作數可以是16位或32位通用寄存器或存儲器操作數。源操作數SRC允許為16位或32位通用寄存器。操作數OPRD可以為立即數或 CL。目的操作數和源操作數SRC數據類型必須一致。

 

 

圖 3.14  雙精度移位指令

 

  SHLD,SHRD指令常用於位串的快速移位、嵌入和刪除等操作,影響標志位為SF,ZF,PF,CF,其它標志位無定義。
  三、位操作指令
位操作指令包括位測試和位掃描指令,可以直接對一個二進制位進行測試,設置和掃描。
  1位測試和設置指令
  格式:BT DEST,SRC
     BTC DEST,SRC
     BTR DEST,SRC
     BTS DEST,SRC
  功能:按照源操作指定的位號,測試目的操作數,當指令執行時,被測試位的狀態被復制到進位標志CF。
  BT將SRC指定的DEST中一位的數值復制到CF。BTC將SRC指定的DEST中一位的數值復制到CF,且將DEST中該位取反。BTR將SRC 指定的DEST中一位的數值復制到CF,且將DEST中該位復位。BTS將SRC指定的DEST中一位的數值復制到CF,且將DEST中該位置位。
  目的操作數為16位或32位通用寄存器或存儲器,源操作數為16位或32位通用寄存器,以及8位立即數,當源操作數為通用寄存器時,必須同目的操作數類型一致。源操作數SRC以兩種方式給出目的操作數的位號,即
  · SRC為8位立即數,以二進制形式直接給出要操作的位號;
  · SRC為通用寄存器,如果DEST為通用寄存器,則SRC中二進制值直接給出要操作的位號。如果DEST為存儲器操作數,通用寄存器SRC為帶符號整數, SRC的值除以DEST的長度所得到的商作為DEST的相對偏移量,余數直接作為要操作的位號。DEST的有效地址為DEST給出的偏移地址和DEST相 對偏移量之和。
  BT,BTC,BTR,BTS指令影響CF標志位,其它標志位無定義。
  例 3.53
  MOV AX,1234H
  MOV ECX,5
  BT AX,CX       ;CF=1AX=1234H
  BTC AX,5       ;CF=1;AX=1214H
  BTS AX,CX;      ;CF=0AX=1234H
  BTR EAX,ECX      ;CF=1EAX=00001214H

  例 3.54

 

      ·MODEL SMALL
      ·586
      ·DATA
   DATA1 DW 1234H,5678H
      ·CODE
      ·START UP
       BTC DATA1,3;CF=0(DATA1)=123CH
       MOV CX,20
       BTR DATA1,CX;CF=1[DATA+2]=5668H
      ·EXIT
       END
  2位掃描指令
  格式:BSFDEST,SRC
     BSRDEST,SRC
  功能:BSF從低位開始掃描源操作數,若所有位都是0,則ZF=0,否則ZF=1。並且將第一個出現1的位號存入目的操作數。BSR從高位開始掃描源操作數,若所有位都是0,則ZF=0,否則ZF=1。並且將第一個出現1的位號存入目的操作數。
  源操作數可以為16位32位通用寄存器或存儲器。目的操作數為16位或32位通用寄存器。源操作數和目的操作數類型必須一致。
  BSF,BSR指令影響ZF標志位,其它標志位無定義。
  例 3.55
  MOV EBX,0F333EE00H
  BSR EAX,EBX;ZF=1EAX=0000001FH=31
  BSF EDX,EBX;ZF=1EDX=00000009H
  3進位標志指令
  (1) 格式:CLC。功能:清除進位標志。
  (2) 格式:STC。功能:設置進位標志。
  (3) 格式:CMC。功能:進位標志取反。
  4條件設置字節指令
  條件設置指令用於根據條件設置某一狀態字節或標志字節,見表33。
  格式:SETcondDEST
  功能:測試條件(cond)若為真,則將目的操作數置01H,否則置00H。目的操作數允許為8位通用寄存器或8位存儲器操作數。
  條件cond與條件轉移指令中的條件相同,共分三類。
  (1) 以標志位狀態為條件可以測試的標志位為ZF,SF,OF,CF,PF。
  (2) 以兩個無符號數比較為條件條件為高於、高於等於、低於、低於等於。
  (3) 以兩個帶符號數比較為條件條件為大於、大於等於、小於、小於等於。
  SET指令不影響標志位。
  使用邏輯運算類指令應注意:
  · 如果沒有特別規定,參與運算的兩個操作數類型必須一致,且只允許一個為存儲器操作數;
  · 如果參與運算的操作數只有一個,且為存儲器操作數,必須使用PTR偽指令說明其數據類型; 
  · 操作數不允許為段寄存器;
  · 目的操作數不允許為立即數;
  · 如果是存儲器尋址,則前面介紹的各種存儲器尋址方式均可使用。

 

表 3.3  條件設置字節指令

 

 


  3.3.4控制轉移類指令
  計算機執行程序一般是順序地逐條執行指令。但經常須要根據不同條件做不同的處理,有時需要跳過幾條指令,有時需要重復執行某段程序,或者轉移到另一個程序段去執行。用於控制程序流程的指令包括轉移、循環、過程調用和中斷調用。
  一、轉移指令
  1無條件轉移指令
  格式:JMP TARGET
  功能:使程序無條件地轉移到指令規定的目的地址TARGET去執行指令。轉移分為短轉移、段內轉移(近程轉移)和段間轉移(遠程轉移)。
  (1) 段內直接轉移:
  格式:JMP SHORT TARGET;短轉移
  JMP NEAR PTR TARGET;近程轉移
  功能:采用相對尋址將當前IP值(即JMP指令下一條指令的地址)與JMP指令中給出的偏移量之和送IP中。段內短轉移(SHORT)指令偏移量為8 位,允許轉移偏移值的范圍為-128~+127。段內近程轉移(NEAR)指令在16位指令模式下,偏移量為16位,允許轉移偏移值范圍為-215~+ 215-1。在32位指令模式下,偏移值范圍為-231~+231-1。

 

  例 3.56
     JMP NEXT
      
  NEXT:MOV AL,BL
  本例為無條件轉移到本段內,標號為NEXT的地址去執行指令,匯編程序可以確定目的地址與JMP指令的距離。
  (2) 段內間接轉移:
  格式:JMP REG
  JMP NEAR PTR [REG]
  功能:段內間接轉移,其中JMP REG指令地址在通用寄存器中,將其內容直接送IP實現程序轉移。JMP NEAR PTR [REG]指令地址在存儲器中,默認段寄存器根據參與尋址的通用寄存器來確定,將指定存儲單元的字取出直接送IP實現程序轉移。在16位指令模式,轉移偏 移值范圍為。在32位指令模式,轉移偏移值范圍為
  例 3.57 設DS=1000HEBX=00002000H。
  JMP BX          ;將2000H送IP
  JMP NEAR PTR [BX]     ;將地址1000∶2000單元存放的一個字送IP
  JMP NEAR PTR [EBX]    ;將段選擇符為1000H,偏移地址為00002000H單元存放的雙字送EIP。
  (3) 段間直接轉移:
  格式:JMP FAR PTR TARGET
  功能:段間直接轉移,FAR PTR說明標號TARGET具有遠程屬性。將指令中由TARGET指定的段值送CS,偏移地址送IP。
  例 3.58 JMP FAR PTR NEXT。
  在16位指令模式下,段基地送CS,偏移地址為16位,轉移偏移值范圍;在32位指令模式下,代碼段選擇符送CS,偏移地址為32位,轉移偏移值范圍為
  (4) 段間間接轉移:
  格式:JMP FAR PTR [Reg]
  功能:段間間接轉移,由FAR PTR [Reg]指定的存儲器操作數作為轉移地址。
在16位指令模式下,存儲器操作數為32位,包括16位段基址和16位偏移地址。
  例 3.59
  JMP FAR PTR [BX]      ;數據段雙字存儲單元低字內容送IP
                ;數據段雙字存儲單元高字內容送CS
  在32位指令模式下,存儲器操作數包括16位選擇符。
  例 3.60  JMP FAR PTR [EAX]
  指令中包含指向目標地址指針的門描述符或TSS描述符的指針,其所指的存儲器操作數中僅選擇符部分有效,指示調用門、任務門或TSS描述符起作用,而偏移部分不起作用。
  2條件轉移指令
  該類指令是根據上一條指令對標志寄存器中標志位的影響來決定程序執行的流程,若滿足指令規定的條件,則程序轉移;否則程序順序執行。
條件轉移指令的轉移范圍為段內短轉移或段內近程轉移,不允許段間轉移。段內短轉移(short)的轉移偏移值范圍為-128~+127。段內近程轉移,在16位指令模式下轉移偏移值范圍為,在32位指令模式下轉移偏移值范圍為
  條件轉移指令包括四類:單標志位條件轉移;無符號數比較條件轉移;帶符號數比較條件轉移;測試CX條件轉移。
  格式:Jcc TARGET
  功能:若測試條件‘CC’為真,則轉移到目標地址TARGET處執行程序。否則順序執行。
  (1) 單標志位條件轉移指令,見表34。
  例 3.61 JZ NEXT;若標志ZF=1則轉移到標號NEXT處執行。
  (2) 無符號數比較條件轉移,見表35。
  例 3.62 JA NEXT;無符號數A與B比較,若A>B則轉移到標號NEXT處執行程序

 


           
表 3.4 單標志位條件轉移指令

 

 

表 3.5 無符號數比較條件轉移指令

 

 

表 3.6 帶符號數比較條件轉移指令

 

 

           

 

  例 3.63  JG NEXT;帶符號數A與B比較,若A>B則轉移到標號NEXT。
  (4) 測試CX條件轉移,見表37

 


表 3.7 測試CX條件轉移指令

 

 


  例 3.64 JCXZ TARGET;CX=0轉移到標號TARGET處。
       JECXZ TARGET;ECX=0轉移到標號TARGET處。
  條件轉移指令一般緊跟在CMP或TEST指令之后,判斷執行CMP或TEST指令對標志位的影響來決定是否轉移。
  例 3.65 符號函數
      
  假設x為某值且存放在寄存器AL中,試編程將求出的函數值f(x)存放在AH中。
    ·MODEL TINY
    ·CODE
    ·STARTUP
     CMPAL,0
     JGE BIG
     MOV AL,0FFH
     JMP DONE
  BIG: JE DONE
     MOV AL,1
  DONE:MOV AH,AL
   ·EXIT
    END
  例 3.66 編程實現把BX寄存器內的二進制數用十六進制數的形式在屏幕上顯示出來。
     ·MODEL TINY
     ·CODE
     ·STARTUP
      MOV CH,4
  AGAIN: MOV CL,4
      ROL BX,CL
      MOV AL,BL
      ANDAL,0FH
      OR AL,30H
      CMP AL,3AH
      JB NEXT
      ADD AL,07H
   NEXT: MOV DL,AL;DL←要顯示的ASCII碼
      MOV AH,2;顯示
      INT 21H
      DECCH
      JNZ AGAIN
     ·EXIT
      END
  二、循環控制指令
  這類指令用(E)CX計數器中的內容控制循環次數,先將循環計數值存放在(E)CX中,每循環一次(E)CX內容減1,直到(E)CX為0時循環結束。
  格式:LOOPcc TARGET
  功能:將(E)CX內容減1,不影響標志位,若(E)CX不等於0,且測試條件‘CC’成立,則轉移到目標地址TARGET處執行程序。轉移范圍為-128~+127。如表38所示。

 

表3.8 循環控制指令

 

 



  例 3.67 計算
      ·MODEL TINY
      ·CODE
      ·STARTUP
       XOR EAX,EAX
       MOV EDX,1
       MOV ECX,1000
   SUM:  ADD EAX,EDX
       INC EDX
       LOOPD SUM
      ·EXIT
       END
  例 3.68 找出以ARRAY為首地址的100個字數組中的第一個非0項,送AX寄存器中。
     ·MODELSMALL
     ·DATA
      ARRAYDW 0,0,0,0,1010H,…;(100個字)
     ·CODE
     ·STARTUP
      MOV CX,64H
      LEA BX,ARRAY
      MOV SI,0FFFEH
  ZERO: INC SI
      INC SI
      CMP WORD PTR [BX+SI],0
      LOOPZ ZERO
      MOV AX,[BX+SI]
     ·EXIT
      END
  關於過程調用和返回指令將在子程序一節中介紹。
  3.3.5串操作指令
  80x86提供處理字符串的操作。串指連續存放在存儲器中的一些數據字節、字或雙字。串操作允許程序對連續存放大的數據塊進行操作。
  串操作通常以DS:(E)SI來尋址源串,以ES:(E)DI來尋址目的串,對於源串允許段超越。(E)SI或(E)DI這兩個地址指針在每次串操作 后,都自動進行修改,以指向串中下一個串元素。地址指針修改是增量還是減量由方向標志來規定。當DF=0,(E)SI及(E)DI的修改為增量;當DF= 1,(E)SI及(E)DI的修改為減量。根據串元素類型不同,地址指針增減量也不同,在串操作時,字節類型SI,DI加、減1;字類型SI,DI加、減 2;雙字類型ESI,EDI加、減4。如果需要連續進行串操作,通常加重復前綴。重復前綴可以和任何串操作指令組合,形成復合指令,見表39。
  一、重復前綴指令

 


表 3.9 重復前綴指令

 

 


  二、方向標志指令
  格式:CLD/STD
  功能:CLD為清除方向標志,即將DF置‘0’。STD為設置方向標志,即將DF置‘1’。
  三、串傳送指令
  基本格式:[REP]MOVS DESTS, SRCS
  [REP] MOVSB/MOVSW/MOVSD
  功能:將DS:(E)SI規定的源串元素復制到ES:(E)DI規定的目的串單元中,見表310。

 

表 3.10 MOVS指令

 

 



  該指令對標志位無影響。
  如果加重復前綴REP,則可以實現連續存放的數據塊的傳送,直到(E)CX=0為止。
  在16位指令模式下,使用SI,DI,CX寄存器;在32位指令模式下,使用ESI,EDI,ECX寄存器。
  例 3.69
   ·MODEL SMALL
   ·DATA
 SRC  DB 1,2,3,…(100個字節)
 DEST DB 100DUP(?)
   ·CODE
   ·STARTUP
    MOV AX,@DATA
    MOV ES,AX
    MOV CX,100
    LEA SI,SRC
    LEA DI,DEST
    CLD
    REP MOVSB
   ·EXIT
    END
  該程序將起始地址為SRC的100個字節內容傳送到起始地址為DEST的存儲單元。
  四、串比較指令
  基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
       [REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
  功能:由DS:(E)SI規定的源串元素減去ES:(E)DI指出的目的串元素,結果不回送,僅影響標志位CF,AF,PF,OF,ZF,SF。當源 串元素與目的串元素值相同時,ZF=1;否則ZF=0。每執行一次串比較指令,根據DF的值和串元素數據類型自動修改(E)SI和(E)DI。
  在串比較指令前加重復前綴REPE/Z,則表示重復比較兩個字符串,若兩個字符串的元素相同則比較到(E)CX=0為止,否則結束比較。在串比較指令 前加重復前綴REPNE/NZ,則表示若兩個字符串元素不相同時,重復比較直到(E)CX=0為止,否則結束比較。
  例 3.70 編程實現兩個串元素比較,如相同則將全“1”送SUT單元,否則全“0”送SUT單元。
      ·MODEL SMALL
      ·DATA
    DEST DB ‘A B C D E F G H’
    SRC  DB ‘A B C E F F F E’
    SUT  DB?
      ·CODE
      ·STARTUP
       MOV AX,@DATA
       MOV ES,AX
       MOV CX,8
       LEA SI,DEST
       LEA DI,SRC
       CLD
       REPE CMPSB
       JZ EQUL;ZF=1;CX=0
       MOV BH,0;CX≠0,ZF=0
       JMP DONE
   EQUL: MOV BH,0FFH
   DONE: MOV SUT,BH
      ·EXIT
       END
  五、串掃描指令
  格式①: [REPE/Z] [REPNE/NZ] SCAS DESTS
  格式②: [REPE/Z] [REPNE/NZ] SCASB/SCASW/SCASD
  功能:由AL,AX或EAX的內容減去ES:(E)DI規定的目的串元素,結果不回送,僅影響標志位CF,AF,PF,SF,OF,ZF。當AL, AX或EAX的值與目的串元素值相同時,ZF=1;否則ZF=0。每執行一次串掃描指令,根據DF的值和串元素數據類型自動修改(E)DI。
  在串掃描指令前加重復前綴REPE/Z,則表示目的串元素值和累加器值相同時重復掃描,直到CX/ECX=0為止,否則結束掃描。若加重復前綴 REPNE/NZ,則表示當目的串元素值與累加器值不相等時,重復掃描直到CX/ECX=0時為止,否則結束掃描。
該指令影響標志位為CF,AF,PF,SF,OF,ZF。
  例 3.71 在內存DEST開始的6個單元尋找字符‘C’,如找到將字符‘C’的地址送ADDR單元,否則0送ADDR單元。
    ·MODEL SMALL
    ·DATA
  DEST DB ‘A B C D E F’
  ADDR DW?;存“C”的地址,所以設置為字類型
    ·CODE
    ·STARTUP
     MOV AX,@DATA
     MOV ES,AX
     MOV CX,6
     LEA DI,DEST
     MOV AL,‘C’
     CLD
     REPNE SCASB
     JZ EQUL
     MOV DI,0
     JMP DONE
 EQUL: DEC DI
 DONE: MOV ADDR,DI
    ·EXIT
     END
  六、 串裝入指令
  格式:LODS SRCS
     LODSB/LODSW/LODSD
  功能:將DS:SI/ESI所指的源串元素裝入累加器(AL,AX,EAX)中,每裝入一次都按照DF值以及串元素類型自動修改地址指針SI/ESI,該指令一般不須加重復前綴,並且不影響標志位。
  七、 串存儲指令
  
格式:[REP] STOS DESTS
     [REP] STOSB/STOSW/STOSD
  功能:將累加器/[AL,AX,EAX/]中值存入ES:DI/EDI所指的目的串存儲單元中,每傳遞一次,都按DF值以及串元素類型自動修改地址指 針DI/EDI。若加重復前綴REP,則表示將累加器的值連續送目的串存儲單元,直到CX/ECX=0時為止。
該指令不影響標志位。
  3.3.6輸入/輸出指令
  一、 輸入指令
  格式:IN DEST, SRC
  功能:根據源操作數SRC給出的端口地址,將操作數從指定端口傳送到目的操作數DEST處,其中DEST為AL,AX或EAX,端口地址SRC可以直接形式給出8位端口地址,或由DX寄存器以間接形式給出。
  例 3.72
  IN AL,10H
  IN AX,20H
  IN EAX,30H
  IN AL,DX
  IN AX,DX
  IN EAX,DX
  二、 輸出指令
  格式OUT DEST, SRC
  功能:將源操作數SRC送到目的操作數DEST所指定的端口。其中源操作數SRC為AL,AX或EAX,目的操作數可以8位端口地址方式直接給出或以DX寄存器間接方式給出。
使用輸入、輸出指令應注意:
  · 直接尋址方式端口地址為8位,共有0~255個端口地址;
  · 間接尋址方式,只能用DX作為地址寄存器,尋址范圍為64K字節;
  · 每個I/O地址對應的端口的數據長度為8位,傳送8位數據占用一個端口地址,傳送16位數據占用2個端口地址,傳送32位數據占用4個端口地址。
  三、 串輸入指令
  格式:[REP] INS DESTS, DX
  [REP] INSB/INSW/INSD
  功能:根據DX給出的端口地址,從外設讀入數據送入以ES:DI/EDI為地址的目的串存儲單元中,每輸入一次,均根據DF的值和串元素類型自動修改 DI/EDI的值。若加重復前綴REP,則表示連續從外設輸入串元素存入目的串存儲單元中,直到CX/ECX=0為止。
  例 3.73 從端口地址為1000H處取數存入內存BLOCK單元。
     ·MODEL SMALL
     ·DATA
      BLOCKDB?
     ·CODE
     ·STARTUP
      MOV AX,@DATA
      MOV ES,AX
      CLD
      LEA DI,BLOCK
      MOV DX,1000H
      INS BLOCK,DX
     ·EXIT
      END
  四、串輸出指令
  格式:[REP] OUTS DX,SRCS
     [REP] OUTSB/OUTSW/OUTSD
  功能:將DS:SI/ESI所指的源串元素,按照DX寄存器指定的端口地址送往外設,每輸出一次,均根據DF的值和串元素類型自動修改SI/ESI的值,若加重復前綴REP,則表示連續向外設輸出串元素,直到CX/ECX=0時為止。
  例 3.74 將內存BLOCK為首地址的100個字符送往端口地址為2000H的外設。
     ·MODEL SMALL
     ·DATA
      BLOCKDB ‘A,B,…’(100個字符)
     ·CODE
     ·STARTUP
      CLD
      LEA SI,BLOCK
      MOV CX,100
      MOV DX,2000H
      REP OUTSB
     ·EXIT
      END
  在使用帶重復前綴的串輸入輸出指令時,必須考慮端口的數據准備或接收狀態。
  所有輸入輸出指令均不影響標志位。
  3.3.7處理器控制
  一、 總線封鎖前綴
  格式:LOCK指令
  功能:LOCK為指令前綴,可以使LOCK引腳變成邏輯0,在LOCK引腳有效期間,禁止外部總線上的其它處理器存取帶有LOCK前綴指令的存儲器操作數。
  可加LOCK前綴的指令:
  (1) ADD/SUB/ADC/SBB/OR/XOR/AND Mem, Reg/imm;
  (2) NOT/NEG/INC/NEC Mem;
  (3) XCHG Reg, Mem或XCHG Mem, Reg;
  (4) BT/BTS/BRT/BTC Mem, Reg/imm。
  Mem為存儲器操作數,Reg為通用寄存器,imm為立即數。
  二、空操作
  格式:NOP
  功能:空操作,除使IP/EIP增1外,不做任何工作。該指令不影響標志位。
  三、處理器等待指令
  格式:WAIT
  功能:檢查BUSY引腳狀態,等待協處理器完成當前工作。
  四、處理器暫停指令
  格式:HLT
  功能:暫停程序的執行。當產生一個外部中斷或非屏蔽中斷時,才繼續執行下一條指令。
  3.3.8中斷指令與DOS功能調用
  一、中斷指令
  在實模式下,中斷矢量以4個字節存放在中斷矢量表中,中斷矢量表為1k字節(00000H~003FFH),中斷矢量表允許存放256個中斷矢量,每 個中斷矢量包含一個中斷服務程序地址(段值和16位偏移地址),中斷矢量地址指針由中斷類型碼乘以4得到。
  在保護模式下,用中斷描述符表代替中斷矢量表,每個中斷由8個字節的中斷描述符來說明,中斷描述符表允許256個中斷描述符,每個中斷描述符包含一個中斷服務地址(段選擇符、32位偏移地址、訪問權限等)。中斷描述符地址指針由中斷類型碼乘以8得到。

 

  中斷指令格式:INT n
  功能:產生中斷類型碼為n的軟中斷,該指令包含中斷操作碼和中斷類型碼兩部分,中斷類型碼n為8位,取值范圍為0~255(00H~FFH)。
  軟中斷執行過程:
  · 將標志寄存器FLAGS(或EFLAGS)壓入堆棧;
  · 清除TF和IF標志位;
  · CS,IP/EIP壓入堆棧;
  · 實模式下,n×4獲取中斷矢量表地址指針;保護模式下,n×8獲取中斷描述符表地址指針;
  · 根據地址指針,從中斷矢量表或中斷描述符表中取出中斷服務程序地址送IP/EIP和CS中,控制程序轉移去執行中斷服務程序。
  中斷返回指令格式:IRET/IRETD
  功能:該指令實現在中斷服務程序結束后,返回到主程序中斷斷點處,繼續執行主程序。
  中斷返回執行過程:
  · IRET指令彈出堆棧中數據送IP,CS,FLAGS;
  · IRETD指令彈出堆棧中數據送EIP,CS,EFLAGS。
  其它中斷類指令如表311所示。

 

表 3.11 中斷類指令

 



  二、DOS功能調用
  系統功能調用是MS—DOS為程序員編寫匯編語言源程序提供的一組子程序,包括設備管理、文件管理和目錄管理等。
  DOS規定使用軟中斷指令INT 21H作為進入各功能子程序的總入口,再為每個功能調用規定一個功能號,引用功能號即可進入相應的子程序入口。DOS系統功能調用的使用方法歸納如下:
  (1) 傳送入口參數到指定的寄存器中;
  (2) 把要調用功能的功能號送入AH寄存器中;
  (3) 用INT 21H指令轉入子程序入口;
  (4) 相應的子程序運行結束后,可以按照規定取得出口參數。
  常用系統功能調用簡介。
  1鍵盤輸入單字符
  這是1號系統功能調用,其調用格式為
   MOV AH,1
   INT 21H
  該功能調用無入口參數。其功能為系統等待鍵盤輸入,如是Ctrol-Break鍵則退出;否則將鍵入字符的ASCII碼送入AL寄存器中,並且通過顯示器顯示該字符。
  2鍵盤輸入字符串
  這是0AH號系統功能調用,其功能為將鍵盤輸入的字符串寫入內存單元中。因此,首先在內存中定義一個緩沖區,緩沖區第一個字節存放規定字符串的最大字 節數,第二個字節由系統送入實際鍵入的字符數,從第三個字節開始用於存放鍵入的字符串,最后通過鍵入回車鍵來表示字符串的結束。如果實際鍵入的字符數未達 到最大規定數,其緩沖區的空余區間填0;如果實際鍵入數超過緩沖區的容量,則超出的字符自動丟失,而且響鈴警告。注意,回車鍵值也存於緩沖區中。
  例 3.75 使用格式舉例。
     ·MODEL SMALL
     ·DATA
   BUF  DB 20
      DB?
      DB 20 DUP(?)
     ·CODE
     ·STARTUP
      MOV DX,OFFSET BUF
      MOV AH,0AH
      INT 21H
     ·EXIT
      END
  該程序在BUF為首地址的緩沖區定義了20個字符串字節的緩沖區,並且將緩沖區首地址送入DX中,調用0AH號子程序,系統等待用戶鍵入字符串,每鍵 入一個字符,其相應的ASCII碼將被寫入緩沖區中,直到鍵入回車鍵,由系統輸入實際鍵入字符數,送入緩沖區第二個字節中。
  3輸出單字符
  這是2號系統功能調用,其使用格式為:
  MOV DL,‘A’
  MOV AH,2
  INT 21H
  執行2號系統功能調用,將置入DL寄存器中的字符(以ASCII碼形式表示)通過顯示器顯示出來(或從打印機輸出)。
  4輸出字符串
  這是9號系統功能調用,其功能是將指定的內存緩沖區中的字符串從顯示器顯示輸出(或從打印機輸出),緩沖區中的字符串以字符‘$’作為結束標志。
  例 3.76使用格式舉例。
    ·MODEL SMALL
    ·DATA
  BUF DB ‘Thank you $’
    ·CODE
    ·STARTUP
     MOV DX,OFFSET BUF
     MOV AH,9
     INT 21H
    ·EXIT
     END
  5返回操作系統
  這是4CH號系統功能調用,使用格式為
  MOV AH,4CH
  INT 21H
  在用戶程序結束處插入此調用,則返回到DOS操作系統,顯示器顯示系統提示符。
習題與思考題
1數據尋址方式有哪幾種?
216位指令模式下和32位指令模式下的存儲器尋址方式各有哪幾種尋址方式?並比較它們相似與不同之處。
3程序地址尋址方式有哪幾種?
4什么是堆棧地址尋址方式?
5指令編碼格式是由哪幾部分組成的?各部分的含義是什么?
6 80x86的指令格式由哪幾部分組成?
7 80x86指令系統按其功能可分為幾部分?
8數據傳送指令包括哪些類型?
9堆棧的含義是什么?80x86所用的堆棧有什么特點?
10堆棧操作指令有哪幾種?
11 XLAT指令在使用時有哪些規定?
12符號擴展指令在什么情況下使用?
13十進制算術運算調整指令在什么情況下使用?它們都是跟在哪些指令的后面?
14哪些指令采用隱含尋址?
15使用算術運算類指令應注意哪些問題?
16邏輯運算指令有幾種?
17測試指令和比較指令在使用時有什么不同?
18算術移位指令和邏輯移位指令有什么不同?
19控制轉移類指令的作用是什么?有哪幾種?
20什么叫串?串操作指令有哪些?串前綴在什么情況下使用?
21輸入/輸出指令起什么作用?尋址方式有哪些?
22設DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX=00001000H,EBX= 00002000H,假設按16位實模式操作,確定下列每條指令訪問內存的物理地址,並且指出源操作數及目的操作數的尋址方式。
(1) MOV AL,[1234H](2) MOV EDX,[BX]
(3) MOV CL,[BX+100H](4) MOV [SI],EBX
(5) MOV AH,BUF[BX+SI](6) MOV EAX,[BP+1234H]
(7) MOV [EAX+EBX],DH
23試指出下列指令中的錯誤。
(1) MOV [BX],[SI](2) MOV AH,DX
(3) INC [BX](4) MOV DS,SS
(5) XCHG AX,2000H(6) MOV AX,[BX+DX]
(7) XCHG [SP],ES(8) ADD [AX],BX
(9) MOV AX,DI+SI(10) INAL,BX
24指出下列算術邏輯指令執行后標志CF,ZF,SF,PF,OF和AF的狀態。
MOV AL,80H
DEC AL
ADD AL,10H
SUB AL,10H
MOV AL,3AH
AND AL,0F0H
OR AL,0F0H
XOR AL,0F0H
25使AX寄存器清0有多種方式,試寫出這多條指令。
26寫出把首地址為BUF的字節緩沖區中第5個字節數送AL寄存器的指令,要求使用以下幾種尋址方式:
(1) 寄存器間接尋址;
(2) 寄存器相對尋址;
(3) 基址變址尋址。
27試分別使用數據傳送指令、交換指令和堆棧操作指令,實現將首地址為BLOCK的內存單元中兩個數據字交換。BLOCK變量定義如下:
BLOCK DW 10H,20H
28設一個字節數據X存放在AL寄存器中,試說明下列程序的功能。
XOR AH,AH
SAL AX,1
MOV BX,AX
MOV CL,2
SAL AX,CL
ADD AX,BX
29試編程實現:
(1) AL寄存器的低4位清0;
(2) BL寄存器的低4位置1;
(3) CL寄存器的低4位取反;
(4) 測試DL寄存器的最低2位是否為0,若是將0送入AL寄存器;否則將1送AL寄存器。
30試編程統計在AX寄存器中有多少個1,並將結果送DL寄存器中。
31試編程統計在內存BLOCK單元開始按字節存放的100個帶符號數中有多少負數,並將結果存放在DL寄存器中。

80x86指令系統


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

圖 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/];通用寄存器和存儲器之間交換數據(16位)
  XCHG AL,/[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內容(有效地址)傳送到EAX中(32位)
  (2) 格式LDS(ES,FS,GS,SS)REG,MEM
  功能:根據源操作數指定的偏移地址,在數據段中取出段地址和偏移地址分別送指定的段寄存器和指定的通用寄存器。
  例 3.22
  LES BX,[SI]        ;將32位地址指針分別送ES和BX
  LSS EAX,[EDI]       ;將48位地址指針分別送SS和EAX
   
  例 3.23
  DATA1  DD buff
   
  LDS BX,DATA1;將buff的32位地址指針分別送DS和BX
   
地址傳送指令對標志位無影響。
  四、標志寄存器傳送指令
  (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指令對標志位的影響


  · 兩個正數比較,使用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。

圖 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/],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移入最高位。

圖 3.13  循環移位指令


  目的操作數可以為通用寄存器或存儲器操作數。循環移位指令影響標志位CF,OF。其它標志位無定義。
  例 3.51
  ROL AL,CL
  ROR BX,5
  RCL ECX,3
  RCR BYTE PTR [SI],CL
  例 3.52  將一個2位數壓縮的BCD碼轉換成二進制數。
   ·MODEL SMALL
   ·DATA
  BCD DB 01011001B
  BIN DB?
    CODE
   ·START UP
    MOV AL,BCD
    MOV BL,AL
    AND BL,0FH
    AND AL,0F0H
    MOV CL,4
    ROR AL,CL
    MOV BH,0AH
    MUL BH
    ADD AL,BL
    MOV BIN,AL
   ·EXIT
    END
  3雙精度移位指令
  格式:SHLD DEST,SRC,OPRD
     SHRD DEST,SRC,OPRD
  功能:對於由目的操作數DEST和源操作數SRC構成的雙精度數,按照操作數OPRD給出的移位位數,進行移位。SHLD是對目的操作數進行左移,如 圖314(a)所示,SHRD是對目的操作數進行右移,如圖314(b)所示。先移出位送標志位CF,另一端空出位由SRC移入DEST中,而SRC 內容保持不變。目的操作數可以是16位或32位通用寄存器或存儲器操作數。源操作數SRC允許為16位或32位通用寄存器。操作數OPRD可以為立即數或 CL。目的操作數和源操作數SRC數據類型必須一致。

圖 3.14  雙精度移位指令

  SHLD,SHRD指令常用於位串的快速移位、嵌入和刪除等操作,影響標志位為SF,ZF,PF,CF,其它標志位無定義。
  三、位操作指令
位操作指令包括位測試和位掃描指令,可以直接對一個二進制位進行測試,設置和掃描。
  1位測試和設置指令
  格式:BT DEST,SRC
     BTC DEST,SRC
     BTR DEST,SRC
     BTS DEST,SRC
  功能:按照源操作指定的位號,測試目的操作數,當指令執行時,被測試位的狀態被復制到進位標志CF。
  BT將SRC指定的DEST中一位的數值復制到CF。BTC將SRC指定的DEST中一位的數值復制到CF,且將DEST中該位取反。BTR將SRC 指定的DEST中一位的數值復制到CF,且將DEST中該位復位。BTS將SRC指定的DEST中一位的數值復制到CF,且將DEST中該位置位。
  目的操作數為16位或32位通用寄存器或存儲器,源操作數為16位或32位通用寄存器,以及8位立即數,當源操作數為通用寄存器時,必須同目的操作數類型一致。源操作數SRC以兩種方式給出目的操作數的位號,即
  · SRC為8位立即數,以二進制形式直接給出要操作的位號;
  · SRC為通用寄存器,如果DEST為通用寄存器,則SRC中二進制值直接給出要操作的位號。如果DEST為存儲器操作數,通用寄存器SRC為帶符號整數, SRC的值除以DEST的長度所得到的商作為DEST的相對偏移量,余數直接作為要操作的位號。DEST的有效地址為DEST給出的偏移地址和DEST相 對偏移量之和。
  BT,BTC,BTR,BTS指令影響CF標志位,其它標志位無定義。
  例 3.53
  MOV AX,1234H
  MOV ECX,5
  BT AX,CX       ;CF=1AX=1234H
  BTC AX,5       ;CF=1;AX=1214H
  BTS AX,CX;      ;CF=0AX=1234H
  BTR EAX,ECX      ;CF=1EAX=00001214H

  例 3.54

      ·MODEL SMALL
      ·586
      ·DATA
   DATA1 DW 1234H,5678H
      ·CODE
      ·START UP
       BTC DATA1,3;CF=0(DATA1)=123CH
       MOV CX,20
       BTR DATA1,CX;CF=1[DATA+2]=5668H
      ·EXIT
       END
  2位掃描指令
  格式:BSFDEST,SRC
     BSRDEST,SRC
  功能:BSF從低位開始掃描源操作數,若所有位都是0,則ZF=0,否則ZF=1。並且將第一個出現1的位號存入目的操作數。BSR從高位開始掃描源操作數,若所有位都是0,則ZF=0,否則ZF=1。並且將第一個出現1的位號存入目的操作數。
  源操作數可以為16位32位通用寄存器或存儲器。目的操作數為16位或32位通用寄存器。源操作數和目的操作數類型必須一致。
  BSF,BSR指令影響ZF標志位,其它標志位無定義。
  例 3.55
  MOV EBX,0F333EE00H
  BSR EAX,EBX;ZF=1EAX=0000001FH=31
  BSF EDX,EBX;ZF=1EDX=00000009H
  3進位標志指令
  (1) 格式:CLC。功能:清除進位標志。
  (2) 格式:STC。功能:設置進位標志。
  (3) 格式:CMC。功能:進位標志取反。
  4條件設置字節指令
  條件設置指令用於根據條件設置某一狀態字節或標志字節,見表33。
  格式:SETcondDEST
  功能:測試條件(cond)若為真,則將目的操作數置01H,否則置00H。目的操作數允許為8位通用寄存器或8位存儲器操作數。
  條件cond與條件轉移指令中的條件相同,共分三類。
  (1) 以標志位狀態為條件可以測試的標志位為ZF,SF,OF,CF,PF。
  (2) 以兩個無符號數比較為條件條件為高於、高於等於、低於、低於等於。
  (3) 以兩個帶符號數比較為條件條件為大於、大於等於、小於、小於等於。
  SET指令不影響標志位。
  使用邏輯運算類指令應注意:
  · 如果沒有特別規定,參與運算的兩個操作數類型必須一致,且只允許一個為存儲器操作數;
  · 如果參與運算的操作數只有一個,且為存儲器操作數,必須使用PTR偽指令說明其數據類型; 
  · 操作數不允許為段寄存器;
  · 目的操作數不允許為立即數;
  · 如果是存儲器尋址,則前面介紹的各種存儲器尋址方式均可使用。

表 3.3  條件設置字節指令


  3.3.4控制轉移類指令
  計算機執行程序一般是順序地逐條執行指令。但經常須要根據不同條件做不同的處理,有時需要跳過幾條指令,有時需要重復執行某段程序,或者轉移到另一個程序段去執行。用於控制程序流程的指令包括轉移、循環、過程調用和中斷調用。
  一、轉移指令
  1無條件轉移指令
  格式:JMP TARGET
  功能:使程序無條件地轉移到指令規定的目的地址TARGET去執行指令。轉移分為短轉移、段內轉移(近程轉移)和段間轉移(遠程轉移)。
  (1) 段內直接轉移:
  格式:JMP SHORT TARGET;短轉移
  JMP NEAR PTR TARGET;近程轉移
  功能:采用相對尋址將當前IP值(即JMP指令下一條指令的地址)與JMP指令中給出的偏移量之和送IP中。段內短轉移(SHORT)指令偏移量為8 位,允許轉移偏移值的范圍為-128~+127。段內近程轉移(NEAR)指令在16位指令模式下,偏移量為16位,允許轉移偏移值范圍為-215~+ 215-1。在32位指令模式下,偏移值范圍為-231~+231-1。

  例 3.56
     JMP NEXT
      
  NEXT:MOV AL,BL
  本例為無條件轉移到本段內,標號為NEXT的地址去執行指令,匯編程序可以確定目的地址與JMP指令的距離。
  (2) 段內間接轉移:
  格式:JMP REG
  JMP NEAR PTR [REG]
  功能:段內間接轉移,其中JMP REG指令地址在通用寄存器中,將其內容直接送IP實現程序轉移。JMP NEAR PTR [REG]指令地址在存儲器中,默認段寄存器根據參與尋址的通用寄存器來確定,將指定存儲單元的字取出直接送IP實現程序轉移。在16位指令模式,轉移偏 移值范圍為。在32位指令模式,轉移偏移值范圍為
  例 3.57 設DS=1000HEBX=00002000H。
  JMP BX          ;將2000H送IP
  JMP NEAR PTR [BX]     ;將地址1000∶2000單元存放的一個字送IP
  JMP NEAR PTR [EBX]    ;將段選擇符為1000H,偏移地址為00002000H單元存放的雙字送EIP。
  (3) 段間直接轉移:
  格式:JMP FAR PTR TARGET
  功能:段間直接轉移,FAR PTR說明標號TARGET具有遠程屬性。將指令中由TARGET指定的段值送CS,偏移地址送IP。
  例 3.58 JMP FAR PTR NEXT。
  在16位指令模式下,段基地送CS,偏移地址為16位,轉移偏移值范圍;在32位指令模式下,代碼段選擇符送CS,偏移地址為32位,轉移偏移值范圍為
  (4) 段間間接轉移:
  格式:JMP FAR PTR [Reg]
  功能:段間間接轉移,由FAR PTR [Reg]指定的存儲器操作數作為轉移地址。
在16位指令模式下,存儲器操作數為32位,包括16位段基址和16位偏移地址。
  例 3.59
  JMP FAR PTR [BX]      ;數據段雙字存儲單元低字內容送IP
                ;數據段雙字存儲單元高字內容送CS
  在32位指令模式下,存儲器操作數包括16位選擇符。
  例 3.60  JMP FAR PTR [EAX]
  指令中包含指向目標地址指針的門描述符或TSS描述符的指針,其所指的存儲器操作數中僅選擇符部分有效,指示調用門、任務門或TSS描述符起作用,而偏移部分不起作用。
  2條件轉移指令
  該類指令是根據上一條指令對標志寄存器中標志位的影響來決定程序執行的流程,若滿足指令規定的條件,則程序轉移;否則程序順序執行。
條件轉移指令的轉移范圍為段內短轉移或段內近程轉移,不允許段間轉移。段內短轉移(short)的轉移偏移值范圍為-128~+127。段內近程轉移,在16位指令模式下轉移偏移值范圍為,在32位指令模式下轉移偏移值范圍為
  條件轉移指令包括四類:單標志位條件轉移;無符號數比較條件轉移;帶符號數比較條件轉移;測試CX條件轉移。
  格式:Jcc TARGET
  功能:若測試條件‘CC’為真,則轉移到目標地址TARGET處執行程序。否則順序執行。
  (1) 單標志位條件轉移指令,見表34。
  例 3.61 JZ NEXT;若標志ZF=1則轉移到標號NEXT處執行。
  (2) 無符號數比較條件轉移,見表35。
  例 3.62 JA NEXT;無符號數A與B比較,若A>B則轉移到標號NEXT處執行程序


           
表 3.4 單標志位條件轉移指令

表 3.5 無符號數比較條件轉移指令

表 3.6 帶符號數比較條件轉移指令

           

  例 3.63  JG NEXT;帶符號數A與B比較,若A>B則轉移到標號NEXT。
  (4) 測試CX條件轉移,見表37


表 3.7 測試CX條件轉移指令


  例 3.64 JCXZ TARGET;CX=0轉移到標號TARGET處。
       JECXZ TARGET;ECX=0轉移到標號TARGET處。
  條件轉移指令一般緊跟在CMP或TEST指令之后,判斷執行CMP或TEST指令對標志位的影響來決定是否轉移。
  例 3.65 符號函數
      
  假設x為某值且存放在寄存器AL中,試編程將求出的函數值f(x)存放在AH中。
    ·MODEL TINY
    ·CODE
    ·STARTUP
     CMPAL,0
     JGE BIG
     MOV AL,0FFH
     JMP DONE
  BIG: JE DONE
     MOV AL,1
  DONE:MOV AH,AL
   ·EXIT
    END
  例 3.66 編程實現把BX寄存器內的二進制數用十六進制數的形式在屏幕上顯示出來。
     ·MODEL TINY
     ·CODE
     ·STARTUP
      MOV CH,4
  AGAIN: MOV CL,4
      ROL BX,CL
      MOV AL,BL
      ANDAL,0FH
      OR AL,30H
      CMP AL,3AH
      JB NEXT
      ADD AL,07H
   NEXT: MOV DL,AL;DL←要顯示的ASCII碼
      MOV AH,2;顯示
      INT 21H
      DECCH
      JNZ AGAIN
     ·EXIT
      END
  二、循環控制指令
  這類指令用(E)CX計數器中的內容控制循環次數,先將循環計數值存放在(E)CX中,每循環一次(E)CX內容減1,直到(E)CX為0時循環結束。
  格式:LOOPcc TARGET
  功能:將(E)CX內容減1,不影響標志位,若(E)CX不等於0,且測試條件‘CC’成立,則轉移到目標地址TARGET處執行程序。轉移范圍為-128~+127。如表38所示。

表3.8 循環控制指令



  例 3.67 計算
      ·MODEL TINY
      ·CODE
      ·STARTUP
       XOR EAX,EAX
       MOV EDX,1
       MOV ECX,1000
   SUM:  ADD EAX,EDX
       INC EDX
       LOOPD SUM
      ·EXIT
       END
  例 3.68 找出以ARRAY為首地址的100個字數組中的第一個非0項,送AX寄存器中。
     ·MODELSMALL
     ·DATA
      ARRAYDW 0,0,0,0,1010H,…;(100個字)
     ·CODE
     ·STARTUP
      MOV CX,64H
      LEA BX,ARRAY
      MOV SI,0FFFEH
  ZERO: INC SI
      INC SI
      CMP WORD PTR [BX+SI],0
      LOOPZ ZERO
      MOV AX,[BX+SI]
     ·EXIT
      END
  關於過程調用和返回指令將在子程序一節中介紹。
  3.3.5串操作指令
  80x86提供處理字符串的操作。串指連續存放在存儲器中的一些數據字節、字或雙字。串操作允許程序對連續存放大的數據塊進行操作。
  串操作通常以DS:(E)SI來尋址源串,以ES:(E)DI來尋址目的串,對於源串允許段超越。(E)SI或(E)DI這兩個地址指針在每次串操作 后,都自動進行修改,以指向串中下一個串元素。地址指針修改是增量還是減量由方向標志來規定。當DF=0,(E)SI及(E)DI的修改為增量;當DF= 1,(E)SI及(E)DI的修改為減量。根據串元素類型不同,地址指針增減量也不同,在串操作時,字節類型SI,DI加、減1;字類型SI,DI加、減 2;雙字類型ESI,EDI加、減4。如果需要連續進行串操作,通常加重復前綴。重復前綴可以和任何串操作指令組合,形成復合指令,見表39。
  一、重復前綴指令


表 3.9 重復前綴指令


  二、方向標志指令
  格式:CLD/STD
  功能:CLD為清除方向標志,即將DF置‘0’。STD為設置方向標志,即將DF置‘1’。
  三、串傳送指令
  基本格式:[REP]MOVS DESTS, SRCS
  [REP] MOVSB/MOVSW/MOVSD
  功能:將DS:(E)SI規定的源串元素復制到ES:(E)DI規定的目的串單元中,見表310。

表 3.10 MOVS指令



  該指令對標志位無影響。
  如果加重復前綴REP,則可以實現連續存放的數據塊的傳送,直到(E)CX=0為止。
  在16位指令模式下,使用SI,DI,CX寄存器;在32位指令模式下,使用ESI,EDI,ECX寄存器。
  例 3.69
   ·MODEL SMALL
   ·DATA
 SRC  DB 1,2,3,…(100個字節)
 DEST DB 100DUP(?)
   ·CODE
   ·STARTUP
    MOV AX,@DATA
    MOV ES,AX
    MOV CX,100
    LEA SI,SRC
    LEA DI,DEST
    CLD
    REP MOVSB
   ·EXIT
    END
  該程序將起始地址為SRC的100個字節內容傳送到起始地址為DEST的存儲單元。
  四、串比較指令
  基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
       [REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
  功能:由DS:(E)SI規定的源串元素減去ES:(E)DI指出的目的串元素,結果不回送,僅影響標志位CF,AF,PF,OF,ZF,SF。當源 串元素與目的串元素值相同時,ZF=1;否則ZF=0。每執行一次串比較指令,根據DF的值和串元素數據類型自動修改(E)SI和(E)DI。
  在串比較指令前加重復前綴REPE/Z,則表示重復比較兩個字符串,若兩個字符串的元素相同則比較到(E)CX=0為止,否則結束比較。在串比較指令 前加重復前綴REPNE/NZ,則表示若兩個字符串元素不相同時,重復比較直到(E)CX=0為止,否則結束比較。
  例 3.70 編程實現兩個串元素比較,如相同則將全“1”送SUT單元,否則全“0”送SUT單元。
      ·MODEL SMALL
      ·DATA
    DEST DB ‘A B C D E F G H’
    SRC  DB ‘A B C E F F F E’
    SUT  DB?
      ·CODE
      ·STARTUP
       MOV AX,@DATA
       MOV ES,AX
       MOV CX,8
       LEA SI,DEST
       LEA DI,SRC
       CLD
       REPE CMPSB
       JZ EQUL;ZF=1;CX=0
       MOV BH,0;CX≠0,ZF=0
       JMP DONE
   EQUL: MOV BH,0FFH
   DONE: MOV SUT,BH
      ·EXIT
       END
  五、串掃描指令
  格式①: [REPE/Z] [REPNE/NZ] SCAS DESTS
  格式②: [REPE/Z] [REPNE/NZ] SCASB/SCASW/SCASD
  功能:由AL,AX或EAX的內容減去ES:(E)DI規定的目的串元素,結果不回送,僅影響標志位CF,AF,PF,SF,OF,ZF。當AL, AX或EAX的值與目的串元素值相同時,ZF=1;否則ZF=0。每執行一次串掃描指令,根據DF的值和串元素數據類型自動修改(E)DI。
  在串掃描指令前加重復前綴REPE/Z,則表示目的串元素值和累加器值相同時重復掃描,直到CX/ECX=0為止,否則結束掃描。若加重復前綴 REPNE/NZ,則表示當目的串元素值與累加器值不相等時,重復掃描直到CX/ECX=0時為止,否則結束掃描。
該指令影響標志位為CF,AF,PF,SF,OF,ZF。
  例 3.71 在內存DEST開始的6個單元尋找字符‘C’,如找到將字符‘C’的地址送ADDR單元,否則0送ADDR單元。
    ·MODEL SMALL
    ·DATA
  DEST DB ‘A B C D E F’
  ADDR DW?;存“C”的地址,所以設置為字類型
    ·CODE
    ·STARTUP
     MOV AX,@DATA
     MOV ES,AX
     MOV CX,6
     LEA DI,DEST
     MOV AL,‘C’
     CLD
     REPNE SCASB
     JZ EQUL
     MOV DI,0
     JMP DONE
 EQUL: DEC DI
 DONE: MOV ADDR,DI
    ·EXIT
     END
  六、 串裝入指令
  格式:LODS SRCS
     LODSB/LODSW/LODSD
  功能:將DS:SI/ESI所指的源串元素裝入累加器(AL,AX,EAX)中,每裝入一次都按照DF值以及串元素類型自動修改地址指針SI/ESI,該指令一般不須加重復前綴,並且不影響標志位。
  七、 串存儲指令
  
格式:[REP] STOS DESTS
     [REP] STOSB/STOSW/STOSD
  功能:將累加器/[AL,AX,EAX/]中值存入ES:DI/EDI所指的目的串存儲單元中,每傳遞一次,都按DF值以及串元素類型自動修改地址指 針DI/EDI。若加重復前綴REP,則表示將累加器的值連續送目的串存儲單元,直到CX/ECX=0時為止。
該指令不影響標志位。
  3.3.6輸入/輸出指令
  一、 輸入指令
  格式:IN DEST, SRC
  功能:根據源操作數SRC給出的端口地址,將操作數從指定端口傳送到目的操作數DEST處,其中DEST為AL,AX或EAX,端口地址SRC可以直接形式給出8位端口地址,或由DX寄存器以間接形式給出。
  例 3.72
  IN AL,10H
  IN AX,20H
  IN EAX,30H
  IN AL,DX
  IN AX,DX
  IN EAX,DX
  二、 輸出指令
  格式OUT DEST, SRC
  功能:將源操作數SRC送到目的操作數DEST所指定的端口。其中源操作數SRC為AL,AX或EAX,目的操作數可以8位端口地址方式直接給出或以DX寄存器間接方式給出。
使用輸入、輸出指令應注意:
  · 直接尋址方式端口地址為8位,共有0~255個端口地址;
  · 間接尋址方式,只能用DX作為地址寄存器,尋址范圍為64K字節;
  · 每個I/O地址對應的端口的數據長度為8位,傳送8位數據占用一個端口地址,傳送16位數據占用2個端口地址,傳送32位數據占用4個端口地址。
  三、 串輸入指令
  格式:[REP] INS DESTS, DX
  [REP] INSB/INSW/INSD
  功能:根據DX給出的端口地址,從外設讀入數據送入以ES:DI/EDI為地址的目的串存儲單元中,每輸入一次,均根據DF的值和串元素類型自動修改 DI/EDI的值。若加重復前綴REP,則表示連續從外設輸入串元素存入目的串存儲單元中,直到CX/ECX=0為止。
  例 3.73 從端口地址為1000H處取數存入內存BLOCK單元。
     ·MODEL SMALL
     ·DATA
      BLOCKDB?
     ·CODE
     ·STARTUP
      MOV AX,@DATA
      MOV ES,AX
      CLD
      LEA DI,BLOCK
      MOV DX,1000H
      INS BLOCK,DX
     ·EXIT
      END
  四、串輸出指令
  格式:[REP] OUTS DX,SRCS
     [REP] OUTSB/OUTSW/OUTSD
  功能:將DS:SI/ESI所指的源串元素,按照DX寄存器指定的端口地址送往外設,每輸出一次,均根據DF的值和串元素類型自動修改SI/ESI的值,若加重復前綴REP,則表示連續向外設輸出串元素,直到CX/ECX=0時為止。
  例 3.74 將內存BLOCK為首地址的100個字符送往端口地址為2000H的外設。
     ·MODEL SMALL
     ·DATA
      BLOCKDB ‘A,B,…’(100個字符)
     ·CODE
     ·STARTUP
      CLD
      LEA SI,BLOCK
      MOV CX,100
      MOV DX,2000H
      REP OUTSB
     ·EXIT
      END
  在使用帶重復前綴的串輸入輸出指令時,必須考慮端口的數據准備或接收狀態。
  所有輸入輸出指令均不影響標志位。
  3.3.7處理器控制
  一、 總線封鎖前綴
  格式:LOCK指令
  功能:LOCK為指令前綴,可以使LOCK引腳變成邏輯0,在LOCK引腳有效期間,禁止外部總線上的其它處理器存取帶有LOCK前綴指令的存儲器操作數。
  可加LOCK前綴的指令:
  (1) ADD/SUB/ADC/SBB/OR/XOR/AND Mem, Reg/imm;
  (2) NOT/NEG/INC/NEC Mem;
  (3) XCHG Reg, Mem或XCHG Mem, Reg;
  (4) BT/BTS/BRT/BTC Mem, Reg/imm。
  Mem為存儲器操作數,Reg為通用寄存器,imm為立即數。
  二、空操作
  格式:NOP
  功能:空操作,除使IP/EIP增1外,不做任何工作。該指令不影響標志位。
  三、處理器等待指令
  格式:WAIT
  功能:檢查BUSY引腳狀態,等待協處理器完成當前工作。
  四、處理器暫停指令
  格式:HLT
  功能:暫停程序的執行。當產生一個外部中斷或非屏蔽中斷時,才繼續執行下一條指令。
  3.3.8中斷指令與DOS功能調用
  一、中斷指令
  在實模式下,中斷矢量以4個字節存放在中斷矢量表中,中斷矢量表為1k字節(00000H~003FFH),中斷矢量表允許存放256個中斷矢量,每 個中斷矢量包含一個中斷服務程序地址(段值和16位偏移地址),中斷矢量地址指針由中斷類型碼乘以4得到。
  在保護模式下,用中斷描述符表代替中斷矢量表,每個中斷由8個字節的中斷描述符來說明,中斷描述符表允許256個中斷描述符,每個中斷描述符包含一個中斷服務地址(段選擇符、32位偏移地址、訪問權限等)。中斷描述符地址指針由中斷類型碼乘以8得到。

  中斷指令格式:INT n
  功能:產生中斷類型碼為n的軟中斷,該指令包含中斷操作碼和中斷類型碼兩部分,中斷類型碼n為8位,取值范圍為0~255(00H~FFH)。
  軟中斷執行過程:
  · 將標志寄存器FLAGS(或EFLAGS)壓入堆棧;
  · 清除TF和IF標志位;
  · CS,IP/EIP壓入堆棧;
  · 實模式下,n×4獲取中斷矢量表地址指針;保護模式下,n×8獲取中斷描述符表地址指針;
  · 根據地址指針,從中斷矢量表或中斷描述符表中取出中斷服務程序地址送IP/EIP和CS中,控制程序轉移去執行中斷服務程序。
  中斷返回指令格式:IRET/IRETD
  功能:該指令實現在中斷服務程序結束后,返回到主程序中斷斷點處,繼續執行主程序。
  中斷返回執行過程:
  · IRET指令彈出堆棧中數據送IP,CS,FLAGS;
  · IRETD指令彈出堆棧中數據送EIP,CS,EFLAGS。
  其它中斷類指令如表311所示。

表 3.11 中斷類指令



  二、DOS功能調用
  系統功能調用是MS—DOS為程序員編寫匯編語言源程序提供的一組子程序,包括設備管理、文件管理和目錄管理等。
  DOS規定使用軟中斷指令INT 21H作為進入各功能子程序的總入口,再為每個功能調用規定一個功能號,引用功能號即可進入相應的子程序入口。DOS系統功能調用的使用方法歸納如下:
  (1) 傳送入口參數到指定的寄存器中;
  (2) 把要調用功能的功能號送入AH寄存器中;
  (3) 用INT 21H指令轉入子程序入口;
  (4) 相應的子程序運行結束后,可以按照規定取得出口參數。
  常用系統功能調用簡介。
  1鍵盤輸入單字符
  這是1號系統功能調用,其調用格式為
   MOV AH,1
   INT 21H
  該功能調用無入口參數。其功能為系統等待鍵盤輸入,如是Ctrol-Break鍵則退出;否則將鍵入字符的ASCII碼送入AL寄存器中,並且通過顯示器顯示該字符。
  2鍵盤輸入字符串
  這是0AH號系統功能調用,其功能為將鍵盤輸入的字符串寫入內存單元中。因此,首先在內存中定義一個緩沖區,緩沖區第一個字節存放規定字符串的最大字 節數,第二個字節由系統送入實際鍵入的字符數,從第三個字節開始用於存放鍵入的字符串,最后通過鍵入回車鍵來表示字符串的結束。如果實際鍵入的字符數未達 到最大規定數,其緩沖區的空余區間填0;如果實際鍵入數超過緩沖區的容量,則超出的字符自動丟失,而且響鈴警告。注意,回車鍵值也存於緩沖區中。
  例 3.75 使用格式舉例。
     ·MODEL SMALL
     ·DATA
   BUF  DB 20
      DB?
      DB 20 DUP(?)
     ·CODE
     ·STARTUP
      MOV DX,OFFSET BUF
      MOV AH,0AH
      INT 21H
     ·EXIT
      END
  該程序在BUF為首地址的緩沖區定義了20個字符串字節的緩沖區,並且將緩沖區首地址送入DX中,調用0AH號子程序,系統等待用戶鍵入字符串,每鍵 入一個字符,其相應的ASCII碼將被寫入緩沖區中,直到鍵入回車鍵,由系統輸入實際鍵入字符數,送入緩沖區第二個字節中。
  3輸出單字符
  這是2號系統功能調用,其使用格式為:
  MOV DL,‘A’
  MOV AH,2
  INT 21H
  執行2號系統功能調用,將置入DL寄存器中的字符(以ASCII碼形式表示)通過顯示器顯示出來(或從打印機輸出)。
  4輸出字符串
  這是9號系統功能調用,其功能是將指定的內存緩沖區中的字符串從顯示器顯示輸出(或從打印機輸出),緩沖區中的字符串以字符‘$’作為結束標志。
  例 3.76使用格式舉例。
    ·MODEL SMALL
    ·DATA
  BUF DB ‘Thank you $’
    ·CODE
    ·STARTUP
     MOV DX,OFFSET BUF
     MOV AH,9
     INT 21H
    ·EXIT
     END
  5返回操作系統
  這是4CH號系統功能調用,使用格式為
  MOV AH,4CH
  INT 21H
  在用戶程序結束處插入此調用,則返回到DOS操作系統,顯示器顯示系統提示符。
習題與思考題
1數據尋址方式有哪幾種?
216位指令模式下和32位指令模式下的存儲器尋址方式各有哪幾種尋址方式?並比較它們相似與不同之處。
3程序地址尋址方式有哪幾種?
4什么是堆棧地址尋址方式?
5指令編碼格式是由哪幾部分組成的?各部分的含義是什么?
6 80x86的指令格式由哪幾部分組成?
7 80x86指令系統按其功能可分為幾部分?
8數據傳送指令包括哪些類型?
9堆棧的含義是什么?80x86所用的堆棧有什么特點?
10堆棧操作指令有哪幾種?
11 XLAT指令在使用時有哪些規定?
12符號擴展指令在什么情況下使用?
13十進制算術運算調整指令在什么情況下使用?它們都是跟在哪些指令的后面?
14哪些指令采用隱含尋址?
15使用算術運算類指令應注意哪些問題?
16邏輯運算指令有幾種?
17測試指令和比較指令在使用時有什么不同?
18算術移位指令和邏輯移位指令有什么不同?
19控制轉移類指令的作用是什么?有哪幾種?
20什么叫串?串操作指令有哪些?串前綴在什么情況下使用?
21輸入/輸出指令起什么作用?尋址方式有哪些?
22設DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX=00001000H,EBX= 00002000H,假設按16位實模式操作,確定下列每條指令訪問內存的物理地址,並且指出源操作數及目的操作數的尋址方式。
(1) MOV AL,[1234H](2) MOV EDX,[BX]
(3) MOV CL,[BX+100H](4) MOV [SI],EBX
(5) MOV AH,BUF[BX+SI](6) MOV EAX,[BP+1234H]
(7) MOV [EAX+EBX],DH
23試指出下列指令中的錯誤。
(1) MOV [BX],[SI](2) MOV AH,DX
(3) INC [BX](4) MOV DS,SS
(5) XCHG AX,2000H(6) MOV AX,[BX+DX]
(7) XCHG [SP],ES(8) ADD [AX],BX
(9) MOV AX,DI+SI(10) INAL,BX
24指出下列算術邏輯指令執行后標志CF,ZF,SF,PF,OF和AF的狀態。
MOV AL,80H
DEC AL
ADD AL,10H
SUB AL,10H
MOV AL,3AH
AND AL,0F0H
OR AL,0F0H
XOR AL,0F0H
25使AX寄存器清0有多種方式,試寫出這多條指令。
26寫出把首地址為BUF的字節緩沖區中第5個字節數送AL寄存器的指令,要求使用以下幾種尋址方式:
(1) 寄存器間接尋址;
(2) 寄存器相對尋址;
(3) 基址變址尋址。
27試分別使用數據傳送指令、交換指令和堆棧操作指令,實現將首地址為BLOCK的內存單元中兩個數據字交換。BLOCK變量定義如下:
BLOCK DW 10H,20H
28設一個字節數據X存放在AL寄存器中,試說明下列程序的功能。
XOR AH,AH
SAL AX,1
MOV BX,AX
MOV CL,2
SAL AX,CL
ADD AX,BX
29試編程實現:
(1) AL寄存器的低4位清0;
(2) BL寄存器的低4位置1;
(3) CL寄存器的低4位取反;
(4) 測試DL寄存器的最低2位是否為0,若是將0送入AL寄存器;否則將1送AL寄存器。
30試編程統計在AX寄存器中有多少個1,並將結果送DL寄存器中。
31試編程統計在內存BLOCK單元開始按字節存放的100個帶符號數中有多少負數,並將結果存放在DL寄存器中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM