数据传输指令
数据传输类指令主要包括数据传送、数据交换、堆栈操作、查表转换、地址传送、标志位传送、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: (封锁)
参考资料:百度百科-汇编指令