天天看點

彙程式設計式基本指令集

指令概述

指令

指令是CPU操作的基本機關,每條指令執行一個特定的操作。可以了解為:指令通知CPU執行某種操作的“指令”。

CPU全部指令的集合,稱為指令集

指令分類

  1. 機器指令:二進制格式編碼的序列(一串0,1代碼書寫)。

    注意:硬體隻能識别,存儲,運作機器指令

  2. 符号指令:用字元串形式的序列(包含字元串形式的操作碼以及操作數助記符)
    彙程式設計式基本指令集

彙編語言基本指令集

總說明(所有的指令都要遵守的)

  1. 對于雙操作數指令(如:MOV,ADD,CMP…)
  • 源,目操作數不可同為記憶體操作數
  • 源,目操作數屬性一緻(長度相同)
  • 當源操作數為立即數,目标操作數為非變量名直接尋址的記憶體操作數,則目标操作數必須用

    PTR

    說明類型
  1. 對于單操作指令(如:INC,DEC…)
  • 若操作數為非變量名直接尋址的記憶體操作數,則必須使用PTR說明類型

常用僞指令

資料定義僞指令

  1. DB

    :位元組定義僞指令
功能:将資料存放到計算機中的記憶體單元時,負數按照補碼存放,單引号中的字元翻譯成ASCII碼
           
彙程式設計式基本指令集

2.

DW

:字定義僞指令

功能:通知彙程式設計式把DW後跟的雙位元組數,依次存入從變量名開始的單元,每一個數,占兩個位元組,存放時滿足小端法規則,即:低位元組->低位址單元,高位元組->高位址單元。
           
彙程式設計式基本指令集

3.

DD

:雙字定義僞指令

變量名 DD 一串用逗号間隔的4位元組數

功能:将資料存放到計算機中的記憶體單元時,負數按照補碼存放,單引号中的字元翻譯成ASCII碼
           
彙程式設計式基本指令集

符号定義僞指令

  1. EQU

    :等值僞指令
NUM EQU 33
MOV AL,NUM  ;該指令與下條指令等價
MOV AL,33
           
  1. =

    :等号僞指令
NUM = 33
功能:定義符号常數NUM的值為33
           

3.EQU和=差別

  • 用EQU定義的符号常數,其值在後句語句中不能更改
  • 用=定義的符号常數,其值在後繼語句中可以重新定義

通用傳送類指令

  • 資料傳送指令

(1) 資料傳送指令:
      MOV 目,源
    功能:把源操作數指派(傳送)給目的操作數,源操作數不變
    說明:  不能向段寄存器中寫入立即數
           CS不能做目标寄存器
    注意:不能用一條指令實作以下傳送:
         1. 存儲單元之間的傳送
         2. 立即數至段寄存器的傳送(中間需要使用一個通用寄存器中轉)
         3. 段寄存器之間的傳送    
           
  • 符号擴充/零擴充傳送指令

(2) 符号擴充/零擴充傳送指令
      MOVSX 目标寄存器,源操作數
      MOVZX 目标寄存器,源操作數
    功能:把源操作數指派(傳送)給目的操作數,源操作數不變
    說明:  1.源操作數不變
           2.源操作數字長要小于或等于目标寄存器字長 
           3. MOVSX源操作數符号位向高位擴充,再送給目标
           4. MOVZX源操作數高位補零,再送給目标
           
  • 有效位址傳送指令

(3) 有效位址傳送指令
    LEA 目标寄存器,源操作數
    功能:計算記憶體單元的有效位址(不是其中的操作數)->目标
    說明:有效位址就是偏移位址,LEA指令等效于OFFSET運算符
           
  • 交換傳送指令

(4) 交換傳送指令
   XCHG 第一操作數,第二操作數
   功能:完成兩個操作數互換
   說明: 1. 段寄存器,立即數不能參加互換
         2. 2個記憶體操作數不能互換,源,目的類型一緻
           

堆棧操作類指令

堆棧的基本概念

堆棧————計算機中的堆棧是人為設定的一片連續記憶體區,用來存放資料,所存資料按先進後出規律存取

棧頂:棧區的低位址

棧底:棧區的高位址

  • 堆棧寄存器SS:存放堆棧段段基址
  • 堆棧指針(SP):存放棧頂單元的偏移位址

    堆棧指針SP的初值決定了堆棧的大小,SP始終指向棧頂的頂部,及始終指向最後壓入堆棧的資訊所在的單元

資料進出棧

  • 入棧PUSH

PUSH src;(先移後入)
一個字進棧,系統自動完成兩步操作:SP←SP-2,(SP)←操作數;
一個雙字進棧,系統自動完成兩步操作:ESP←ESP-4,(ESP)←操作數。
           
  • 出棧POP

POP dst;(先出後移)
彈出一個字,系統自動完成兩步操作:操作數←(SP),SP←SP+2;
彈出一個雙字,系統自動完成兩步操作:操作數←(ESP),ESP←ESP+4。
           

注意:堆棧操作指令中的操作數類型必須是字操作數,即16位操作數

算數運算類指令

彙程式設計式基本指令集
  • 二進制加法
  1. ADD

    :不帶進位加法指令
ADD 目标操作數(dst),源操作數(src) ;dst <- dst+src
    功能:将目的操作數與源操作數相加,并将結果送給目的操作數
           
  1. ADC

    :帶進位加法指令
ADC 目标操作數(dst),源操作數(src)  ;dst <- dst+src+CF
    功能:将目的操作數與源操作數相加,再加上進位标志CF的内容,然後将結果送給目的操作數
           
  1. INC

    :加一指令
INC 目标操作數(dst)  ;dst <- dst+1
   功能:将目的操作數加一,并将結果送回目的操作數。
           
  • 二進制減法

    1.

    SUB

    :不帶借位減法指令
SUB 目标操作數(dst),源操作數(src) ;dst <- dst-src;
 功能:将目的操作數減源操作數,結果送回目的操作數。
           

2.

SBB

:帶借位減法指令

SBB 目标操作數(dst),源操作數(src) ;dst <- dst-src-CF;
 功能:将目的操作數減源操作數,然後再減進位标志CF,并将結果送回目的操作數。
           
  1. DEC

    :減一指令
DEC 目标操作數(dst)  ;dst <- dst-1
  功能:将目的操作數減一,結果送回目的操作數。
           
  • 求補指令

    NEG

    :求補指令
NEG 目标操作數(dst) ; dst <- 0-dst
  功能:用0減去目的操作數,結果送回原來的目的操作數。
           
  • 比較指令

    CMP

    :比較指令
CMP 目标操作數(dst),源操作數(src) ;dst-src
  功能:将目的操作數減源操作數,但結果不送回目的操作數。
           
  • 乘法指令
  1. MUL

    :無符号數乘法指令
MUL src ;(AX)<-(src)*(AL)
  功能:将源操作數與預設的目的操作數(AX或AL)相乘,結果儲存在AX或DX,AX中。
           
  1. IMUL

    :帶符号數乘法指令
IMUL src ;
  功能:将源操作數與預設的目的操作數(AX或AL)相乘,結果儲存在AX或DX,AX中。
  說明:運算結果隻影響狀态标志CF,OF;
           
  • 除法指令
  1. DIV

    :無符号數除法指令
DIV src ;(AL)<-(AX)*(src) (商)  (AH) <- 餘數
  功能:将兩個無符号數做除法運算,商和餘數分别儲存在指定位置。
           
  1. IDIV

    :帶符号數除法指令
IDIV src 
  功能:将兩個帶符号數做除法運算,商和餘數分别儲存在指定位置。
  說明:當被除數位不夠時,需要進行擴充。
           
  • 位元組擴充指令
CBW
 功能:把AL中的帶符号數擴充為16位字長(符号位擴充到AH中)。
           
  • 字擴充指令
CWD
 功能:将AX中的符号位擴充到DX中
           

轉移類指令

  1. 按照轉移條件分:無條件轉移和有條件轉移
  • 有符号條件轉移

    彙程式設計式基本指令集
  • 循環控制轉移

    彙程式設計式基本指令集
  1. 按照轉移範圍分:段内轉移和段間轉移
  2. 按照擷取轉移位址的方法分:直接轉移和間接轉移
    彙程式設計式基本指令集

調用類指令

  • 子程式調用與傳回指令

CALL   <調用位址>
  RET  ;傳回斷點
           

子程式

:能完成一定功能的相對獨立的程式段

調用

:調用子程式,即無條件轉到子程式的第一條指令

傳回

:傳回斷點,即傳回到

CALL

的後繼指令

彙程式設計式基本指令集
  • 段内調用CALL指令

  1. 段内直接調用

    :主程式和子程式待在同一代碼段中
CALL  過程名
           
  1. 段内間接調用

CALL  寄存器操作數
  CALL  記憶體操作數
           
  • 子程式(彙編語言)的過程定義語句

過程名   PROC  屬性
           子程式實體
          RET
  過程名  ENDP
           

過程名

:子程式名,以字母開頭,經彙編之後,過程名就是子程式的第一條指令

PROC/ENDP

:是子程式的定界語句

屬性

: NEAR(或預設)代表近過程,即該子程式和調用它的那條指令在同一個代碼段。

FAR代表遠過程,即該子程式和調用它的那條指令不在同一個代碼段。

RET

:RET子程式傳回指令

彙程式設計式基本指令集

邏輯運算類指令

  • NOT

    :取反
NOT 目的操作數(dst)  
  功能:實作操作數的按位取反運算,把取反的結果送給目标操作數
  說明:NOT用于使所有位取反
           
彙程式設計式基本指令集
  • AND

    :與指令
AND 目的操作數(dst),源操作數(src)  
  功能:實作兩個操作數的按位與運算,将兩個操作數與之後的結果送給目标操作數
  說明:AND通常用于使某些位置0,其他位不變的情況
           
彙程式設計式基本指令集
  • OR

    :或運算
OR 目的操作數(dst),源操作數(src)    
  功能:實作操作數的按位或運算,把或的結果送給目标操作數
  說明:OR通常用于将某些位置1
           
彙程式設計式基本指令集
  • XOR

    :異或運算
XOR 目的操作數(dst),源操作數(src)  
  功能:實作操作數的按位異或運算,把異或的結果送給目标操作數
  說明:XOR通常用于将某些位取反,某些位保持不變
           
彙程式設計式基本指令集
  • TEST

    :測試
TEST 目的操作數(dst),源操作數(src) 
  功能:實作兩個操作數的按位與運算,結果不儲存,隻影響标志位
           

移位指令

開環移位指令

  • 算數左移

SAL 操作數,移位次數
  說明:操作數向左移位,最高位被擠入進位位中,用0來補充最低位
           
  • 算數右移

SAR 操作數,移位次數
  說明:操作數向右移位,最低位被擠入進位位中,用原來操作數的最高位來補充最高位
           
  • 邏輯左移

SHL 操作數,移位次數
  說明:操作數向左移位,最高位被擠入進位位中,用0來補充最低位
           
  • 邏輯右移

SHR 操作數,移位次數
  說明:操作數向右移位,最低位被擠入進位位中,用0來補充最高位
           
彙程式設計式基本指令集

閉環移位指令

  • 含進位的循環左移

RCL 操作數,移位次數
  說明:操作數向左移位,最高位被擠入進位位中,用原來的進位位來補充最低位
           
  • 含進位的循環右移

RCR 操作數,移位次數
  說明:操作數向右移位,最低位被擠入進位位中,用原來進位位來補充最高位
           
  • 不含進位的循環左移

ROL 操作數,移位次數
  說明:操作數向左移位,最高位被擠入操作數的最低位,同時最高位進入進位位,用操作數的次高位補充最高位
           
  • 不含進位的循環右移

ROR 操作數,移位次數
  說明:操作數向右移位,最低位被擠入操作數的最高位,同時最低位進入進位位,用操作數的次低位補充最低位。
           
彙程式設計式基本指令集

繼續閱讀