複製鏈接
請複製以下鏈接發送給好友

彙編指令

鎖定
彙編指令是彙編語言中使用的一些操作符和助記符,還包括一些偽指令(如assume,end),彙編指令同機器指令一一對應。每一種CPU都有自己的彙編指令集。 [1] 
計算機是通過執行指令來處理數據的,為了指出數據的來源、操作結果的去向及所執行的操作,一條指令一般包含操作碼和操作數兩部分。 [2] 
中文名
彙編指令
外文名
assembly instruction
領    域
彙編語言
應用領域
程序調試
指令類別
整數指令
學    科
計算機科學與技術、電子信息技術

彙編指令編譯背景

任何一種微處理器(CPU)在設計時,就已規定好自己特定的指令系統,這種指令系統的功能也就決定了由該微處理器構成的計算機系統及其基本功能。指令系統中所設計的每條指令都對應着微處理器要完成的一種規定功能操作,即這些指令功能的實現都是由微處理器中的物理器件完成的。要使計算機完成一個完整的任務,就需要執行一組指令,這組指令通常稱為程序。計算機能夠執行的各種不同指令的集合就稱為處理器(CPU)的指令系統。 [3] 
一台計算機只能識別由二進制編碼表示的指令,稱之為機器指令。一條機器指令應包括兩部分內容:一部分給出該指令應完成何種操作,稱為指令操作碼部分;另一部分給出參與操作的操作數的值,或指出操作數存放在何處、操作的結果應送往何處等,這一部分稱為指令的操作數部分。處理器可根據指令中給出的地址信息求出存放操作數的地址稱為有效地址EA(Effective Address),然後對存放在有效地址中的操作數進行存取操作。指令中關於如何求岀存放操作數有效地址的方法稱為操作數的尋址方式。計算機按照指令給出的尋址方式求出操作數有效地址進行存取操作數的過程,稱為指令的尋址操作。 [3] 

彙編指令指令的格式

指令是計算機能夠識別和執行的操作命令,由二進制數“0”、“1”組成。每條指令的編碼格式由機器指令系統規定。通常,一條指令包含操作碼和操作數兩部分內容,格式如下圖所示:
操作碼(Operation Code)用來説明指令操作的性質與功能,常用OP表示。操作碼是指令中不可缺少的部分,通常由1~2個字節組成,機器通過譯碼電路來識別指令。操作數用於提供指令中要處理的數據或數據所在的地址信息。
以MOV指令作為例子,MOV指令的格式為:MOV dst,src。其中:MOV為指令助記符,表示傳送,dst為目標操作數,src表示源操作數,該指令的功能是將源操作數傳送到目標單元。例如:
MOV......AL,20H;將8位立即數20H傳送到AL中。
MOV......AX,1234H;將16位立即數1234H傳送到AX中。
MOV......EAX,34568020H;將32位立即數34568020H傳送到EAX中。 [4] 

彙編指令尋址方式

彙編指令寄存器尋址

操作數的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執行時直接取出寄存器值來操作。 [5] 

彙編指令立即尋址

立即尋址指令中的操作碼字段後面的地址碼部分即是操作數本身,也就是説,數據就包含在指令當中,取出指令也就取出了可以立即使用的操作數(立即數)。 [5] 

彙編指令寄存器移位尋址

寄存器移位尋址是ARM指令集特有的尋址方式。當第2個操作數是寄存器移位方式時,第2個寄存器操作數在與第1個操作數結合之前,選擇進行移位操作。 [5] 

彙編指令寄存器間接尋址

寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針。 [5] 

彙編指令基址尋址

基址尋址就是將基址寄存器的內容與指令中給出的偏移量相加,形成操作數的有效地址。基址尋址用於訪問基址附近的存儲單元,常用於查表、數組操作、功能部件寄存器訪問等。 [5] 

彙編指令多寄存器尋址

多寄存器尋址一次可以傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。 [5] 

彙編指令堆棧尋址

堆棧尋址是一個按特定順序進行存取的存儲區,操作順序為”後進先出“。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。 [5] 

彙編指令數據傳輸指令

數據傳輸類指令主要包括數據傳送、數據交換、堆棧操作、查錶轉換、地址傳送、標誌位傳送、I/O數據傳送指令。這類指令的主要特點是大部分指令操作完成後,對FR中的標誌位不產生影響。它們在存儲器寄存器、寄存器和輸入輸出端口之間傳送數據。 [4] 

彙編指令數據傳送指令

MOV:傳送字或字節。
MOVSX:先符號擴展,再傳送。
MOVZX:先零擴展,再傳送。
PUSH:把字壓入堆棧
POP: 把字彈出堆棧
PUSHA: 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧
POPA: 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧
PUSHAD: 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆棧
POPAD: 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆棧
BSWAP: 交換32位寄存器裏字節的順序。
XCHG: 交換字或字節。( 至少有一個操作數為寄存器,段寄存器不可作為操作數)
CMPXCHG: 比較並交換操作數。(第二個操作數必須為累加器AL/AX/EAX)
XADD: 先交換再累加。( 結果在第一個操作數裏 )
XLAT: 字節查錶轉換── BX 指向一張 256 字節的表的起點,AL 為表的索引值(0-255,即0-FFH); 返回 AL 為查表結果 ( [BX+AL]->AL) [6] 

彙編指令輸入輸出端口傳送指令

IN: I/O端口輸入。( 語法:IN 累加器,{端口號│DX} )
OUT: I/O端口輸出. (語法:OUT {端口號│DX},累加器)輸入輸出端口由立即方式指定時,其範圍是 0-255;由寄存器DX 指定時,其範圍是 0-65535。 [6] 

彙編指令目的地址傳送指令

LEA: 裝入有效地址。例:LEA DX,string;把偏移地址存到DX。
LDS: 傳送目標指針,把指針內容裝入DS。例: LDS SI,string;把段地址偏移地址存到DS:SI。
LES: 傳送目標指針,把指針內容裝入ES。例: LES DI,string;把段地址偏移地址存到ES:DI。
LFS: 傳送目標指針,把指針內容裝入FS。例: LFS DI,string;把段地址偏移地址存到FS:DI。
LGS: 傳送目標指針,把指針內容裝入GS。例: LGS DI,string;把段地址偏移地址存到GS:DI。
LSS: 傳送目標指針,把指針內容裝入SS。例: LSS DI,string;把段地址偏移地址存到SS:DI。 [6] 

彙編指令標誌傳送指令

LAHF標誌寄存器傳送,把標誌裝入AH。
SAHF: 標誌寄存器傳送,把AH內容裝入標誌寄存器。
PUSHF: 標誌入棧
POPF: 標誌出棧
PUSHD: 32位標誌入棧
POPD: 32位標誌出棧 [6] 

彙編指令算術運算指令

算數運算類指令包括加減乘除、比較與調整指令。它們可進行8位、16位和32位的運算。參加運算的操作數可以説二進制數和十進制數(BCD碼),這些數可以是無符號數,也可以是帶符號數。算術運算指令的主要特點是執行結果影響標誌寄存器的狀態標誌位OF、SF、ZF、AF、PF、CF。 [4] 
ADD: 加法。
ADC: 帶進位加法。
INC: 加 1。
AAA: 加法的ASCII碼調整。
DAA: 加法的十進制調整。
SUB: 減法。
SBB: 帶借位減法。
DEC: 減 1。
NEG: 取補。
CMP: 比較。(兩操作數作減法,僅修改標誌位,不回送結果)
AAS: 減法的ASCII碼調整。
DAS: 減法的十進制調整。
MUL: 無符號乘法。結果回送AH和AL(字節運算),或DX和AX(字運算)
IMUL: 整數乘法。結果回送AH和AL(字節運算),或DX和AX(字運算)
AAM: 乘法的ASCII碼調整。
DIV: 無符號除法:商回送AL,餘數回送AH,(字節運算);或商回送AX,餘數回送DX(字運算)
IDIV: 整數除法:商回送AL,餘數回送AH,(字節運算);或商回送AX,餘數回送DX(字運算)
AAD: 除法的ASCII碼調整。
CBW: 字節轉換為字。(把AL中字節的符號擴展到AH中去)
CWD: 字轉換為雙字。(把AX中的字的符號擴展到DX中去)
CWDE: 字轉換為雙字。 (把AX中的字符號擴展到EAX中去)
CDQ: 雙字擴展。(把EAX中的字的符號擴展到EDX中去) [6] 

彙編指令邏輯運算類指令

邏輯運算類指令分為邏輯運算指令和移位指令兩大類。 [4] 

彙編指令邏輯運算指令

AND: 與運算。
or: 或運算。
XOR: 異或運算。
NOT: 取反。
TEST: 測試。(兩操作數作與運算,僅修改標誌位,不回送結果) [6] 

彙編指令移位指令

SHL: 邏輯左移。
SAL: 算術左移。(=SHL)
SHR: 邏輯右移。(每位右移,低位進 CF,高位補 0)
SAR: 算術右移。(每位右移, 低位進 CF,高位不變)
ROL: 循環左移。
ROR: 循環右移。
RCL: 通過進位的循環左移。
RCR: 通過進位的循環右移。
以上八種移位指令,其移位次數可達255次。
移位一次時,可直接用操作碼,如:SHL AX,1;移位>1次時,則由寄存器CL給出移位次數,如:MOV CL,04;SHL AX,CL。 [6] 

彙編指令串操作指令

串操作指令用於處理存放在存儲器中的數據串,有串傳送、串比較、串掃描、串裝入、串存儲。其中,僅有串比較和串掃描指令對標誌位OF、SF、ZF、AF、PF、CF有影響。 [4] 
DS:SI ——源串段寄存器:源串變址
ES:DI ——目標串段寄存器:目標串變址
CX: 重複次數計數器。
AL/AX: 掃描值。
D標誌: 0表示重複操作中SI和DI應自動增量;1表示應自動減量。
Z標誌: 用來控制掃描或比較操作的結束。
MOVS: 串傳送。(MOVSB 傳送字符, MOVSW 傳送字, MOVSD 傳送雙字)
CMPS: 串比較。(CMPSB 比較字符, CMPSW 比較字)
SCAS: 串掃描。把AL或AX的內容與目標串作比較,比較結果反映在標誌位。
LODS: 裝入串。把源串中的元素(字或字節)逐一裝入AL或AX中。(LODSB 傳送字符, LODSW 傳送字,LODSD 傳送雙字)
STOS: 保存串。是LODS的逆過程。
REP: 當CX/ECX<>0時重複。
REPE/REPZ: 當ZF=1或比較結果相等,且CX/ECX<>0時重複。
REPNE/REPNZ: 當ZF=0或比較結果不相等,且CX/ECX<>0時重複。
REPC: 當CF=1且CX/ECX<>0時重複。
REPNC: 當CF=0且CX/ECX<>0時重複。 [6] 

彙編指令程序轉移指令

控制轉移類指令包括無條件轉移指令、條件轉移指令、循環控制指令、中斷指令、子程序調用和返回指令。 [4] 

彙編指令無條件轉移指令

(長轉移)
JMP: 無條件轉移指令。
CALL: 過程調用。
RET/RETF: 過程返回。 [6] 

彙編指令條件轉移指令

(短轉移,-128到+127的距離內;當且僅當(SF、XOR、OF)=1時,OP1<OP2 )
JA/JNBE: 大於轉移。
JAE/JNB: 大於或等於轉移。
JB/JNAE: 小於轉移。
JBE/JNA: 小於或等於轉移。
以上四條,測試無符號整數運算的結果(標誌C和Z)
JG/JNLE: 大於轉移。
JGE/JNL: 大於或等於轉移。
JL/JNGE: 小於轉移。
JLE/JNG: 小於或等於轉移。
以上四條,測試帶符號整數運算的結果(標誌S,O和Z)
JE/JZ: 等於轉移。
JNE/JNZ: 不等於時轉移。
JC: 有進位時轉移。
JNC: 無進位時轉移。
JNO: 不溢出時轉移。
JNP/JPO: 奇偶性為奇數時轉移。
JNS: 符號位為 "0" 時轉移。
JO: 溢出轉移。
JP/JPE: 奇偶性為偶數時轉移。
JS: 符號位為 "1" 時轉移。 [6] 

彙編指令循環控制指令

(短轉移)
LOOP: CX不為零時循環。
LOOPE/LOOPZ: CX不為零且標誌Z=1時循環。
LOOPNE/LOOPNZ: CX不為零且標誌Z=0時循環。
JCXZ: CX為零時轉移。
JECXZ: ECX為零時轉移。 [6] 

彙編指令中斷指令

INT: 中斷指令
INTO: 溢出中斷。
IRET: 中斷返回。 [6] 

彙編指令其他指令

彙編指令偽指令

DB: 定義字節(1字節)
DW: 定義字(2字節)
DD: 定義雙字(4字節)
PROC: 定義過程。
ENDP: 過程結束。
SEGMENT: 定義段。
ASSUME: 建立段寄存器尋址
ENDS: 段結束。
END: 程序結束。 [6] 

彙編指令處理機控制指令

即標誌處理指令,處理機控制指令完成簡單的控制功能。
CLC: (進位位置0指令)
CMC: (進位位求反指令)
CLC: (進位位置為0指令)
STC: (進位位置為1指令)
CLD: (方向標誌位置0指令)
STD: (方向標誌位置1指令)
CLI: (中斷標誌置0指令)
STI: (中斷標誌置1指令)
NOP: (無操作)
HLT: (停機)
WAIT: (等待)
ESC: (換碼)
LOCK: (封鎖) [6] 
參考資料
  • 1.    王爽.彙編語言:清華大學出版社,2013.09:8
  • 2.    魏彬.微型計算機原理:西安電子科技大學出版社,2017.07:38
  • 3.    胡元義.《編譯原理教程(第4版)》習題解析與上機指導:西安電子科技大學出版社,2017:129
  • 4.    張凡,盛珣華,戴勝華.微機原理與接口技術:清華大學出版社,北京交通大學出版社,2010
  • 5.    青島東合信息技術有限公司.嵌入式Linux開發技術及實踐:西安電子科技大學出版社,2014:24-25
  • 6.    寧書林,劉鍵林.軟件逆向分析實用技術:北京理工大學出版社,2013.03:62-69