80x86指令系統

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 MOV EDX,[BX]
(3) MOV CL,BX+100H MOV [SI],EBX
(5) MOV AH,BUFBX+SI MOV EAX,[BP+1234H]
(7) MOV [EAX+EBX],DH
23試指出下列指令中的錯誤。
(1) MOV [BX],SI MOV AH,DX
(3) INC BX 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寄存器中。
 
目前您尚未登錄,請 登錄 或 註冊 後進行評論
he_and
he_and2018-02-01 10:102樓回覆
走心了
qq_37215335
qq_372153352017-11-23 10:241樓回覆
寫的不錯,韓好合好
常用匯編指令 qingkongyeyueqingkongyeyue2016年08月22日 12:093683
1、加減指令 2、adr指令 adr是小範圍的地址讀取僞指令,ldr是大範圍的讀取地址僞指令。可實際上adr是將基於PC相對偏移的地址值或基於寄存器相對地址值讀取的爲指令,而ldr用於加載32爲立...
幾種基本彙編指令詳解 luoyhang003luoyhang0032015年07月07日 11:023284
幾種基本彙編指令詳解常見寄存器 寄存器 16位 32位 64位 累加寄存器 AX EAX RAX 基址寄存器 BX EBX RBX 計數寄存器 C...

2018,程序員都在搶這張卡?
我司的程序員同事都人手一張!也是厲害了..
彙編指令解讀 peenopeeno2016年11月07日 17:472504
16位數據操作指令 名字 功能 ADC 帶進位加法(ADD with Carry) ADD 加法 AND 按位與。這裏的按位與和C的”&”功能相同 ASR 算術右...
彙編指令解釋大全 liuy88141liuy881412015年06月06日 20:197208
彙編語言指令詳講(2011-05-13 17:31:32) 標籤: it 分類: 彙編-C-C-java-VB編程 AAA ...
ARM中的---彙編指令 qqliyunpengqqliyunpeng2015年04月19日 00:0615004
一. 帶點的(一般都是ARM GNU僞彙編指令) 1. “.text”、“.data”、“.bss” 依次表示的是“以下是代碼段”, “以下是初始化數據段”, “以下是未初始化數據段”。 2."....

彙編指令push,mov,call,pop,leave,ret建立與釋放棧的過程
感覺這東西有點燒腦,花了一下午時間終於整個捋順了整個流程。 想理解好此過程,理解每個指令的作用,必須結合指令行地址,棧地址和寄存器一起來分析,否則很容易被繞暈。 大圖圖片說明:內存地址,彙編指令都...
liu_if_elseliu_if_else2017年05月28日 18:411550
彙編指令集合 llyzcyllyzcy2007年11月03日 23:181513
AAA 加法的ASCII碼或非壓縮BCD碼調整指令AAD 除法的ASCII碼或非壓縮BCD碼調整指令AAM 乘法的ASCII碼或非壓縮BCD碼調整指令AAS 減法的ASCII碼或非壓縮BCD碼調整指令...
ARM彙編指令(B/BL/BX) lee244868149lee2448681492014年12月05日 15:581949
跳轉指令用於實現程序流程的跳轉,在 ARM 程序中有兩種方法可以實現程序流程的跳轉: (1) 使用專門的跳轉指令。 (2) 直接向程序計數器 PC 寫入跳轉地址值。 通過向程序計數...
彙編指令 yeookyeook2012年06月14日 12:278640
彙編語言指令詳講(2011-05-13 17:31:32) 標籤: it 分類: 彙編-C-C-java-VB編程 AAA ...
彙編語言指令大全最新發布完整版 huangkangyinghuangkangying2016年01月27日 22:052220
彙編語言指令大全最新發布完整版 一、數據傳輸指令 ─────────────────────────────────────── 它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據. 1...
彙編語言基本指令 wangbaochuwangbaochu2014年12月10日 20:053015
一.機械碼,又稱機器碼. ultraedit打開,編輯exe文件時你會看到 許許多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F組成的數碼,這些數碼 就是機器碼. 修改程...

彙編指令全集 brk1985brk19852014年06月09日 11:121230
學習彙編語言,最關鍵的就在於彙編指令集的掌握以及計算機工作方式的理解,以下是80X86彙編過程中經常用到的一些彙編指令。 從功能分類上來說,一共可分爲 一、 數據傳送指令:MOV、XCHG、LE...
彙編語言之轉移指令和原理 u011068702u0110687022016年10月31日 20:131921
 1、引言 可以修改IP,或同時修改CS和IP的指令統稱爲轉移指令。概括地講,轉移指令就是可以控制CPU執行內存 中某處代碼的指令。 8086CPU的轉移行爲有以下幾類: 1. 同時修改...
彙編指令大全+很全的彙編指令
2011年03月10日 15:59169KB下載

彙編語言指令大全(詳細) linlibestlinlibest2013年05月09日 11:311250
彙編語言指令大全 8080彙編手冊數據傳輸指令 ────────────────────────────── 它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據。 1。 通用數據傳送指令。 MO...
彙編指令大全
2017年11月25日 11:47220KB下載

X86彙編指令集 u014563989u0145639892016年12月09日 10:371451
一、數據傳輸指令   它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據.   1. 通用數據傳送指令.     MOV  傳送字或字節.     MOVSX 先符號擴展,再傳送.     MOV...
ARM指令集和X86指令集的比較 zhaozy55555zhaozy555552009年12月31日 17:236802
一、背景知識: 指令的強弱是CPU的重要指標,指令集是提高微處理器效率的最有效工具之一。從現階段的主流體系結構講,指令集可分爲複雜指令集(CISC)和精簡指令集(RISC)兩部分。相應的,微處理隨...
x86 指令集發展歷程 charlesleicharleslei2016年09月29日 17:04860
從 1976 年第 1 代 x86 processor 算起,x86 指令發展經過了 35 年,這裏回顧一下 x86 指令集的歷程以及 AMD 與 Intel 的指令鬥爭史: 8086 指令:伴...
intel x86彙編指令 chenlyclychenlycly2016年08月17日 21:423611
intel x86彙編指令
Intel x86 & x64 彙編指令集(共七卷)
2012年09月27日 09:4116.54MB下載

X86 彙編詳解 u012313689u0123136892016年11月11日 16:07356
80x86指令系統   80x86指令系統,指令按功能可分爲以下七個部分。   (1) 數據傳送指令。   (2) 算術運算指令。   (3) 邏輯運算指令。   (4) 串操作指令...
X86彙編指令學習筆記 qq_20977145qq_209771452016年09月27日 21:462246
今天來扒一扒X86彙編指令(IA-32指令),首先看看它的概念: IA-32(Intel Architecture 32bit,英特爾32位體系架構)[1] ,屬於X86體系結構的32位版本,即...
X86彙編 通用寄存器總結 qq_33775402qq_337754022017年05月11日 20:21802
學習X86彙編有一段時間了,是時候總結一波了 X86彙編 通用寄存器總結 一、通用寄存器的名字 見下圖 eax ,ebx,ecx,edx,esp,ebp,esi,sdi 二、雖然名字...
x86彙編指令詳解 ywb201314ywb2013142016年11月15日 16:36727
80x86指令系統   80x86指令系統,指令按功能可分爲以下七個部分。   (1) 數據傳送指令。   (2) 算術運算指令。   (3) 邏輯運算指令。   (4) 串操作指令。 ...
X86 彙編語言 yuanmengong886yuanmengong8862016年09月14日 19:00646
本文描述基本的32位X86彙編語言的一個子集,其中涉及彙編語言的最核心部分,包括寄存器結構,數據表示,基本的操作指令(包括數據傳送指令、邏輯計算指令、算數運算指令),以及函數的調用規則。個人認爲:在理...
搭建x86彙編語言學習環境 sxhelijiansxhelijian2017年02月03日 10:021967
設計彙編語言的教學方案,決定就從8086彙編開始。   學彙編,關注對系統底層的理解,指令太多,初學者傷不起。面對一個複雜的系統,教學中常需要設計一個教學模型,抽取出其中的核心,以此得門而入。  ...

從一段x86彙編程序看計算機是如何工作 cagent_zcagent_z2017年02月26日 12:58276

  1. 彙編一個簡單的C程序 將C代碼彙編成彙編代碼 gcc -S -o main.s main.c -m32 得到一個main.s文件,裏面以點開頭的都是鏈接時的輔助信息;我們在看這些彙編代碼時可以把...
    X86彙編快速入門 u010229420u0102294202017年02月08日 13:28940
    本文翻譯自:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html 本文描述基本的32位X86彙編語言的一個子集,其中涉及彙編語言的最核心部分...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章