汇编常见指令
一、数据传送指令
指令 功能 示例 说明 MOV数据传送 MOV EAX, 10将立即数 10 送入 EAX MOV [EBX], EAX将 EAX 值存入 EBX 指向的内存 LEA加载有效地址 LEA EAX, [EBX+4]将 EBX+4 的地址存入 EAX(不访问内存) XCHG交换数据 XCHG EAX, EBX交换 EAX 和 EBX 的值 PUSH/POP栈操作 PUSH EAX将 EAX 压入栈 POP EBX 弹出栈顶到 EBX
二、算术运算指令
指令 功能 示例 ADD加法 ADD EAX, EBX ; EAX = EAX + EBXSUB减法 SUB AX, 5 ; AX = AX - 5INC/DEC自增/自减 INC ECX ; ECX++ DEC DL ; DL–MUL无符号乘法 MUL BL ; AX = AL * BLIMUL有符号乘法 IMUL CX ; DX:AX = AX * CXDIV无符号除法 DIV BX ; AX = (DX:AX) / BXIDIV有符号除法 IDIV CL ; AL = AX / CL
三、位操作指令
指令 功能 示例 AND按位与 AND AL, 0xF0 ; 清零 AL 的低4位OR按位或 OR DX, 1 ; 设置 DX 的最低位为1XOR按位异或 XOR EAX, EAX ; 快速清零 EAXNOT按位取反 NOT BL ; BL = ~BLSHL/SHR逻辑左移/右移 SHL AX, 1 ; AX 左移1位(乘2)SAL/SAR算术左移/右移 SAR DX, 2 ; 有符号右移(除4)ROL/ROR循环左移/右移 ROL CL, 3 ; CL 循环左移3位
四、流程控制指令
1. 无条件跳转
2. 条件跳转(基于标志位)
指令 跳转条件 说明 JE/JZZF=1 相等/为零时跳转 JNE/JNZZF=0 不等/非零时跳转 JG/JNLE(ZF=0) & (SF=OF) 有符号大于时跳转 JL/JNGESF ≠ OF 有符号小于时跳转 JA/JNBE(CF=0) & (ZF=0) 无符号大于时跳转 JB/JCCF=1 无符号小于/进位时跳转
3. 比较与测试
指令 功能 说明 CMP比较操作数 CMP AX, BX ; 设置标志位(AX-BX)TEST位测试 TEST AL, 1 ; 检查 AL 最低位(AL & 1)
4. 循环控制
指令 功能 示例 LOOPECX 减1,非零则跳转 LOOP labelLOOPEECX≠0 且 ZF=1 时跳转 LOOPE label
五、函数调用指令
指令 功能 说明 CALL调用函数 CALL func ; 压入返回地址后跳转RET从函数返回 RET ; 弹出返回地址并跳转
六、标志位操作
指令 功能 STC设置进位标志 CF=1 CLC清除进位标志 CF=0 STD设置方向标志 DF=1(字符串操作从高地址向低地址) CLD清除方向标志 DF=0(默认低→高)
七、字符串操作指令
指令 功能 说明 MOVSB移动字节串 [EDI] ← [ESI],按 DF 更新 ESI/EDICMPSB比较字节串 比较 [ESI] 和 [EDI],更新标志位 SCASB扫描字节串 比较 AL 和 [EDI],常用于搜索字符 LODSB加载字节到 AL AL ← [ESI], ESI++STOSB存储 AL 到字节串 [EDI] ← AL, EDI++
🔥 提示:搭配前缀 REP(如 REP MOVSB)可重复执行至 ECX=0。
八、系统调用指令
架构 指令 功能 x86 (Linux) INT 0x80触发系统调用(参数通过 EAX/EBX/ECX 传递) x86-64 SYSCALL64位系统调用(参数:RAX/RDI/RSI/RDX) Windows INT 0x2EWindows NT 系统调用
关键注意点
操作数大小 :
MOV AL, BL(8位) vs MOV AX, BX(16位) vs MOV EAX, EBX(32位) 内存访问格式 :
直接寻址:MOV EAX, [0x4000] 寄存器间接:MOV CL, [ESI] 带偏移:MOV DX, [EBX+8] AT&T vs Intel 语法 :
Intel:MOV EAX, DWORD PTR [EBX] AT&T:movl (%ebx), %eax(目标在后)
经典代码片段
section . data
msg db 'Hello World!' , 0xA ; 定义字符串
section . text
global _start
_start:
MOV EAX, 4 ; sys_write 系统调用号
MOV EBX, 1 ; 文件描述符 ( stdout )
MOV ECX, msg ; 字符串地址
MOV EDX, 13 ; 字符串长度
INT 0x80 ; 调用内核
MOV EAX, 1 ; sys_exit
XOR EBX, EBX ; 返回码 0
INT 0x80