汇编基本指令
汇编语言的基本指令围绕数据处理、内存操作、控制流程等核心功能,不同架构(如 x86、ARM)指令略有差异,以下以 x86/x86-64 架构为例,整理最常用的基本指令:
一、数据传输指令(移动数据)
用于在寄存器、内存、立即数之间传递数据,核心是 mov,衍生指令用于特殊场景。
| 指令 | 功能说明 | 示例 |
|---|---|---|
| mov | 将源操作数的值复制到目标操作数 | mov rax, rbx(寄存器间传值)mov [rbp], 0x123(立即数存内存) |
| push | 将数据压入栈(栈顶指针减小,数据入栈) | push rax(将 rax 压栈) |
| pop | 从栈顶取数据到目标(栈顶指针增大) | pop rbx(栈顶数据存入 rbx) |
| lea | 计算内存地址并存入寄存器(常用于取地址) | lea rax, [rbp+8](计算地址存 rax) |
二、算术运算指令(数值计算)
处理加减乘除等运算,结果通常存在第一个操作数中,影响标志位(如进位、零标志)。
| 指令 | 功能说明 | 示例 |
|---|---|---|
| add | 加法:目标 = 目标 + 源 | add rax, 5(rax += 5) |
| sub | 减法:目标 = 目标 - 源 | sub rbx, rcx(rbx -= rcx) |
| mul | 无符号乘法:rax = rax * 源(64 位) | mul rbx(rax = rax * rbx) |
| div | 无符号除法:rax = 被除数 / 源,余数存 rdx | div rcx(rax = rax/rcx,rdx = 余数) |
| inc | 自增:目标 = 目标 + 1 | inc rdi(rdi++) |
| dec | 自减:目标 = 目标 - 1 | dec rsi(rsi–) |
三、逻辑运算指令(位操作与逻辑判断)
对二进制位进行操作,或执行逻辑判断(与、或、非等)。
| 指令 | 功能说明 | 示例 |
|---|---|---|
| and | 按位与:目标 = 目标 & 源(清零特定位) | and rax, 0x0F(保留 rax 低 4 位) |
| or | 按位或:目标 = 目标 | 源(置位特定位) |
| xor | 按位异或:目标 = 目标 ^ 源(翻转特定位) | xor rcx, rcx(rcx 清零,常用技巧) |
| not | 按位非:目标 = ~ 目标(每一位取反) | not rdx(rdx 所有位取反) |
| shl | 逻辑左移:目标 = 目标 << 源(低位补 0) | shl rax, 2(rax 左移 2 位,即乘 4) |
| shr | 逻辑右移:目标 = 目标 >> 源(高位补 0) | shr rbx, 1(rbx 右移 1 位,即除 2) |
标题四、控制转移指令(改变执行流程)
用于跳转、循环、函数调用等,改变指令指针(rip/eip)的值。
| 指令 | 功能说明 | 示例 |
|---|---|---|
| jmp | 无条件跳转至目标地址 | jmp label(跳转到 label 标签处) |
| je/jz | 相等 / 零标志位为 1 时跳转(等于则跳) | je loop(若相等,跳至 loop) |
| jne/jnz | 不相等 / 零标志位为 0 时跳转(不等于则跳) | jne exit(若不等,跳至 exit) |
| jl | 小于时跳转(有符号比较) | jl error(若小于,跳至 error) |
| jg | 大于时跳转(有符号比较) | jg next(若大于,跳至 next) |
| call | 函数调用:压入返回地址,跳至函数入口 | call func(调用 func 函数) |
| ret | 函数返回:从栈弹出返回地址,跳转回去 | ret(从函数返回调用处) |
| cmp | 比较(目标 - 源),仅修改标志位(不存结果) | cmp rax, rbx(比较 rax 和 rbx) |
五、栈与帧操作指令(函数调用相关)
维护函数调用栈帧,保存 / 恢复程序状态。
| 指令 | 功能说明 | 示例 |
|---|---|---|
| push/pop | 压栈 / 出栈(见上文) | push rbp、pop rbp |
| enter | 创建栈帧(等价于 push rbp + mov rbp, rsp) | enter 0, 0(创建空栈帧) |
| leave | 销毁栈帧(等价于 mov rsp, rbp + pop rbp) | leave(退出函数前恢复栈帧) |
六、特权指令(内核态专用)
| 指令 | 功能说明 |
|---|---|
| syscall | x86-64 系统调用,用户态→内核态切换 |
| sysret | x86-64 系统调用,内核态返回用户态 |
| int 0x80 | 32 位系统调用,通过软中断切换态 |
| iret | 用于 int 0x80 等软中断 / 硬件中断的返回 |
| cli/sti | 关闭 / 开启中断响应 |
| hlt | 暂停处理器,等待中断唤醒 |
sysret和int:两者的核心差异在于:sysret 更高效,因为它直接使用 rcx/r11 寄存器恢复状态,无需像 iret 那样从栈中读取返回信息(栈操作开销更高)。
8785

被折叠的 条评论
为什么被折叠?



