本文仅仅简单介绍了汇编语言中常用的指令。
汇编语言是一种低级编程语言c;与机器语言非常接近c;通常用于编写底层系统软件或优化性能关键代码。汇编语言指令与CPU架构密切相关c;不同架构(如x86、ARM、MIPS等)的指令集不同。以下是常见的汇编语言指令分类及其功能介绍:
用于在寄存器、内存和I/O端口之间传输数据。
MOV:将数据从源操作数复制到目标操作数。
MOV AX, BX ; 将BX的值复制到AX
PUSH:将数据压入栈。
PUSH AX ; 将AX的值压入栈
POP:从栈中弹出数据。
POP BX ; 将栈顶数据弹出到BX
XCHG:交换两个操作数的值。
XCHG AX, BX ; 交换AX和BX的值
用于执行基本的算术运算。
ADD:将两个操作数相加。
ADD AX, BX ; AX = AX + BX
SUB:将两个操作数相减。
SUB AX, BX ; AX = AX - BX
MUL:无符号乘法。
MUL BX ; AX = AX * BX(结果存储在DX:AX中)
DIV:无符号除法。
DIV BX ; AX = AX / BX(商在AXc;余数在DX)
INC:将操作数加1。
INC AX ; AX = AX + 1
DEC:将操作数减1。
DEC AX ; AX = AX - 1
用于执行逻辑操作。
AND:按位与操作。
AND AX, BX ; AX = AX & BX
OR:按位或操作。
OR AX, BX ; AX = AX | BX
XOR:按位异或操作。
XOR AX, BX ; AX = AX ^ BX
NOT:按位取反操作。
NOT AX ; AX = ~AX
SHL/SHR:逻辑左移/右移。
SHL AX, 1 ; 将AX左移1位
SHR AX, 1 ; 将AX右移1位
用于改变程序的执行流程。
JMP:无条件跳转。
JMP label ; 跳转到label处
RET:从子程序返回。
RET ; 返回到调用者
条件跳转指令:根据标志寄存器状态跳转。
JE/JZ:等于/为零时跳转。
JE label ; 如果ZF=1c;跳转到label
JNE/JNZ:不等于/不为零时跳转。
JNE label ; 如果ZF=0c;跳转到label
JG/JNLE:大于时跳转。
JG label ; 如果ZF=0且SF=OFc;跳转到label
JL/JNGE:小于时跳转。
JL label ; 如果SF≠OFc;跳转到label
用于比较或测试操作数的值。
CMP:比较两个操作数(相当于SUBc;但不保存结果)。
CMP AX, BX ; 比较AX和BXc;设置标志寄存器
TEST:按位与操作(不保存结果)。
TEST AX, BX ; AX & BXc;设置标志寄存器
用于操作标志寄存器。
STC:设置进位标志(CF=1)。
STC ; CF = 1
CLC:清除进位标志(CF=0)。
CLC ; CF = 0
STD:设置方向标志(DF=1c;字符串操作从高地址向低地址)。
STD ; DF = 1
CLD:清除方向标志(DF=0c;字符串操作从低地址向高地址)。
CLD ; DF = 0
用于处理字符串或数据块。
MOVS:移动字符串(从源地址复制到目标地址)。
MOVSB ; 复制一个字节
MOVSW ; 复制一个字
LODS:加载字符串到累加器。
LODSB ; 加载一个字节到AL
STOS:将累加器的值存储到字符串。
STOSB ; 将AL的值存储到目标地址
REP:重复执行指令(通常与MOVS、LODS、STOS等配合使用)。
REP MOVSB ; 重复复制字节c;直到CX=0
用于与I/O端口通信。
IN:从I/O端口读取数据。
IN AL, 60h ; 从端口60h读取一个字节到AL
OUT:向I/O端口写入数据。
OUT 60h, AL ; 将AL的值写入端口60h
用于控制CPU行为。
NOP:空操作(用于延时或占位)。
NOP ; 无操作
HLT:暂停CPU。
HLT ; 暂停CPU
INT:触发软中断。
INT 21h ; 触发中断21h
IRET:从中断返回。
IRET ; 返回到中断前的状态
LEA:加载有效地址。
LEA AX, [BX+SI+10] ; 将BX+SI+10的地址加载到AX
NEG:取反操作。
NEG AX ; AX = -AX
汇编语言指令直接操作硬件c;因此需要熟悉目标CPU的指令集和寄存器结构。常用的指令包括数据传送、算术运算、逻辑运算、控制转移、字符串操作等。掌握这些指令是编写高效汇编代码的基础。