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
  該程式


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 立你斯 的頭像
    立你斯

    立你斯學習記錄

    立你斯 發表在 痞客邦 留言(0) 人氣()