汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end),汇编指令同机器指令一一对应。每一种CPU都有自己的汇编指令集。
计算机是通过执行指令来处理数据的,为了指出数据的来源、操作结果的去向及所执行的操作,一条指令一般包含操作码和操作数两部分。
中文名汇编指令, 外文名assembly instruction领域汇编语言应用领域程序调试指令类别整数指令学
任何一种微处理器(CPU)在设计时,就已规定好自己特定的指令系统,这种指令系统的功能也就决定了由该微处理器构成的计算机系统及其基本功能。指令系统中所设计的每条指令都对应着微处理器要完成的一种规定功能操作,即这些指令功能的实现都是由微处理器中的物理器件完成的。要使计算机完成一个完整的任务,就需要执行一组指令,这组指令通常称为程序。计算机能够执行的各种不同指令的集合就称为处理器(CPU)的指令系统。
一台计算机只能识别由二进制编码表示的指令,称之为机器指令。一条机器指令应包括两部分内容:一部分给出该指令应完成何种操作,称为指令操作码部分;另一部分给出参与操作的操作数的值,或指出操作数存放在何处、操作的结果应送往何处等,这一部分称为指令的操作数部分。处理器可根据指令中给出的地址信息求出存放操作数的地址称为有效地址EA(Effective Address),然后对存放在有效地址中的操作数进行存取操作。指令中关于如何求岀存放操作数有效地址的方法称为操作数的寻址方式。计算机按照指令给出的寻址方式求出操作数有效地址进行存取操作数的过程,称为指令的寻址操作。
指令是计算机能够识别和执行的操作命令,由二进制数“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中。
-
命令参数顺序: 右至左.
命令 靶, 源
-
参数尺寸: 由暂存器名字决定.
mov eax, 0x11223344
-
AT&T语法用特殊记号如前缀$表立即数及%表暂存器. 而Intel语法采用不同名字来区分暂存器, 恒数等.
-
有效地址.
mov eax, [ebx+ecx*4+内存地址]
操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。
立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(立即数)。
寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。
寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于査表、数组操作、功能部件寄存器访问等。
多寄存器寻址一次可以传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。
堆栈寻址是一个按特定顺序进行存取的存储区,操作顺序为”后进先出“。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。
数据传输类指令主要包括数据传送、数据交换、堆栈操作、查表转换、地址传送、标志位传送、I/O数据传送指令。这类指令的主要特点是大部分指令操作完成后,对FR中的标志位不产生影响。它们在存储器和寄存器、寄存器和输入输出端口之间传送数据。
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)
IN: I/O端口输入。( 语法:IN 累加器,{端口号│DX} )
OUT: I/O端口输出. (语法:OUT {端口号│DX},累加器)输入输出端口由立即方式指定时,其范围是 0-255;由寄存器DX 指定时,其范围是 0-65535。
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。
LAHF:标志寄存器传送,把标志装入AH。 SAHF: 标志寄存器传送,把AH内容装入标志寄存器。 PUSHF: 标志入栈。 POPF: 标志出栈。 PUSHD: 32位标志入栈。 POPD: 32位标志出栈。
算数运算类指令包括加减乘除、比较与调整指令。它们可进行8位、16位和32位的运算。参加运算的操作数可以说二进制数和十进制数(BCD码),这些数可以是无符号数,也可以是带符号数。算术运算指令的主要特点是执行结果影响标志寄存器的状态标志位OF、SF、ZF、AF、PF、CF。
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中去)
逻辑运算类指令分为逻辑运算指令和移位指令两大类。
AND: 与运算。
or: 或运算。
XOR: 异或运算。
NOT: 取反。
TEST: 测试。(两操作数作与运算,仅修改标志位,不回送结果)
SHL: 逻辑左移。
SAL: 算术左移。(=SHL)
SHR: 逻辑右移。(每位右移,低位进 CF,高位补 0)
SAR: 算术右移。(每位右移, 低位进 CF,高位不变)
ROL: 循环左移。
ROR: 循环右移。
RCL: 通过进位的循环左移。
RCR: 通过进位的循环右移。
以上八种移位指令,其移位次数可达255次。
移位一次时,可直接用操作码,如:SHL AX,1;移位>1次时,则由寄存器CL给出移位次数,如:MOV CL,04;SHL AX,CL。
串操作指令用于处理存放在存储器中的数据串,有串传送、串比较、串扫描、串装入、串存储。其中,仅有串比较和串扫描指令对标志位OF、SF、ZF、AF、PF、CF有影响。
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时重复。
控制转移类指令包括无条件转移指令、条件转移指令、循环控制指令、中断指令、子程序调用和返回指令。
(长转移)
JMP: 无条件转移指令。 CALL: 过程调用。 RET/RETF: 过程返回。
(短转移,-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" 时转移。
(短转移)
LOOP: CX不为零时循环。
LOOPE/LOOPZ: CX不为零且标志Z=1时循环。
LOOPNE/LOOPNZ: CX不为零且标志Z=0时循环。
JCXZ: CX为零时转移。
JECXZ: ECX为零时转移。
INT: 中断指令。
INTO: 溢出中断。
IRET: 中断返回。
DB: 定义字节(1字节)
DW: 定义字(2字节)
DD: 定义双字(4字节)
PROC: 定义过程。
ENDP: 过程结束。
SEGMENT: 定义段。
ASSUME: 建立段寄存器寻址。
ENDS: 段结束。
END: 程序结束。
即标志处理指令,处理机控制指令完成简单的控制功能。
CLC: (进位位置0指令)
CMC: (进位位求反指令)
CLC: (进位位置为0指令)
STC: (进位位置为1指令)
CLD: (方向标志位置0指令)
STD: (方向标志位置1指令)
CLI: (中断标志置0指令)
STI: (中断标志置1指令)
NOP: (无操作)
HLT: (停机)
WAIT: (等待)
ESC: (换码)
LOCK: (封锁)