汇编语言是一种低级编程语言,与特定的计算机架构紧密相关,是机器语言的人类可读形式,通过助记符来代表机器指令。

主要组成部分

助记符:代表操作的简短英文缩写

寄存器(Registers):CPU内部的高速存储单元,用于暂存数据和地址

操作数:指令作用的对象,可以是寄存器、内存地址或立即数(常量)

标签:用于标记代码中的特定位置,常作为跳转指令的目标

伪指令:给汇编器的指令,不生成机器码,用于定义数据段、分配内存等

x86 / x86-64 架构(intel/AMD)助记符

数据传送类

分类助记符全称功能描述示例备注
通用数据传输movmove基础数据复制(源->目的)mov eax,ebx最常用,不影响标志位
movzxmove with zero extend小位数->大位数,高位补0movzx eax,al无符号数扩展
movsxmove with sign extend小位数->大位数,高位补符号位movsx eax,al有符号数扩展
累加器专用ininput from port从I/O端口读入累加器in al,0x60仅用al/ax/eax
outoutput to port从累加器写到I/O端口仅用al/ax/eax
xlattranslate查表:ds:ebx[al]->al又称“换码指令”
地址传送leaload effective address取有效地址(偏移量)到寄存器lea eax,[ebx+ecx*2+0x10]不访问内存,仅计算地址,不影响标志位
lds/les/lfs/lgs/lssload data/extra/fs/gs/stack segment加载远指针(段寄存器 + 通用寄存器)lds eax,[0x1234]32位常用,64位极少用段寄存器
累加器扩展cbwconvert byte to wordal 符号位扩展 -> ax8位->16位
cwdconvert word to doublewordax 符号位扩展 -> dx:ax16位->32位(dx存高位)
cdqconvert doubleword to quadwordeax 符号位扩展 -> edx:eax32位->64位(edx存高位)
cqoconvert quadword to octawordrax 符号位扩展 -> rdx:rax64位专用
数据交换xchgexchange交换两个操作数的值xchg eax,ebx不影响标志位
bswapbytes swap反转寄存器字节序(大小端转换)32位/64位通用
xaddexchange and add交换后相加,和存目的先交换,再eax=原eax+原ebx
cmpxchgcompare add exchange比较累加器与目的,相等则源->目的,否则目的->累加器比较eax 与 ebx
栈操作pushpush onto stack数据压入栈(栈顶减后存)push eax32位 esp-4,64位rsp-8
poppop from stack栈顶弹出数据(取后栈顶加)pop ebx32位 esp+4,64位rsp+8
pusha/popapush/pop all general registers压入/弹出所有通用寄存器仅32位,64位用pushfq/popfq(标志寄存器)

算术运算类

分类助记符全称功能描述示例备注
加法类addadd基础加法:目的=目的+源add eax,5影响CF/OF/ZF/SF/PF标志位
adcadd with carry带进位加法:目的=目的+源+CF用于多字节/大数加法(配合add)
incincrement自增1:操作数=操作数+1inc ecx
减法类subsubtract基础减法:目的=目的-源sub eax,ebx
sbbsubtract with borrow带借位减法:目的=目的-源-CF
decdecrement自减1:操作数=操作数-1dec edx
negnegate(取负)求补:操作数=0-操作数neg eax
乘法类mulmultiply(unsigned)无符号乘法imul eax,ebx操作数非0则CF=1,否则CF=0;影响OF/ZF/SF/PF
imulinteger multiply(signed)有符号乘法单操作数同mul;双/三操作数更灵活,CTF常用
除法类divdivide(unsigned)无符号除法idiv ebx
idivinteger divide(signed)有符号除法
比较类cmpcompare比较(做减法但不存结果,仅改标志位)
BCD调整类daadecimal adjust after subtraction加法后BCD码调整仅用于8位BVD数加法,现代极少用
dasdecimal adjust after subtraction减法后BCD码调整仅用于8位BVD数减法,现代极少用
aaaascii adjust after addition加法后ASCII码调整仅用于ASCII数字加法,现代极少用
aasascii adjust after subtraction减法后ASCII码调整仅用于ASCII数字减法,现代极少用
aamascii adjust after multiplication乘法后ASCII码调整仅用于ASCII数字乘法,现代极少用
aadascii adjust before division除法前ASCII码调整仅用于ASCII数字除法,现代极少用

逻辑运算类

助记符全称功能描述示例
andand按位与
oror按位或
xorexclusive or按位异或(常用于清零寄存器)
notnot按位取反
testtest按位与但不保存结果(仅影响标志位)
shl/salshift left左移
shrshift right逻辑右移
sarshift arithmetic right算术右移(保留符号位)
rol/rorrotate left/right循环左移/右移

控制流类

助记符全称功能描述示例
jmpiump无条件跳转jmp lable_start
je/jzjump if equal/zero相等/为零时跳转je lable_equal
jne/jnzjump if not equal/not zero不相等/不为零时跳转jne lable_loop
jg/jnlejump if greater大于时跳转(有符号)jg lable_greater
jl/jngejump if less小于时跳转(有符号)jl lable_less
ja/jnbejump if above高于时跳转(无符号)ja lable_above
jb/jnaejump if below低于时跳转(无符号)jb lable_below
callcall调用子程序call printf
retreturn从子程序返回ret
looploop循环(cx/ecx/rcx减1非零则跳)loop lable_start

字符串与特殊操作

助记符功能描述
cmp比较(执行减法但不保存结果,只改标志位)
nop空操作(no operation),常用于占位或延时
int触发软件中断(如int 0x80系统调用)
stos/movs/lods/cmps/scas字符串操作指令(配合rep前缀使用)