汇编指令学习指南
编程小白也能看懂的常用汇编指令详解,用最通俗的语言解释底层原理
EAX
累加寄存器
用于算术运算
EBX
基址寄存器
存储内存地址
ECX
计数寄存器
用于循环计数
EDX
数据寄存器
I/O操作辅助
ESI/EDI
源/目标索引
用于字符串操作
📦 数据传送指令
MOV – 数据搬运工
把数据从一个地方搬到另一个地方,就像用快递把包裹从A点送到B点。
MOV EAX, 10 ; 把数字10放进EAX寄存器
MOV EBX, EAX ; 把EAX的值复制到EBX
MOV EBX, EAX ; 把EAX的值复制到EBX
PUSH/POP – 栈操作
像往箱子里放书(PUSH)和取书(POP),遵循”后进先出”原则。
PUSH EAX ; 把EAX的值放入栈顶
POP EBX ; 从栈顶取出值放入EBX
POP EBX ; 从栈顶取出值放入EBX
LEA – 取地址
获取内存地址而不是值,就像问”你家在哪”而不是”你家里有什么”。
LEA EAX, [EBX+4] ; 计算EBX+4的地址存入EAX
🧮 算术运算指令
ADD/SUB – 加减法
基本加减运算,ADD是加法,SUB是减法。
ADD EAX, 5 ; EAX = EAX + 5
SUB EBX, 10 ; EBX = EBX – 10
SUB EBX, 10 ; EBX = EBX – 10
INC/DEC – 自增自减
给寄存器加1或减1,相当于C语言的++和–操作。
INC ECX ; ECX加1
DEC EDX ; EDX减1
DEC EDX ; EDX减1
MUL/DIV – 乘除法
MUL是无符号乘法,DIV是无符号除法。乘法结果可能占用两个寄存器。
MUL ECX ; EAX * ECX,结果在EDX:EAX
DIV EBX ; EDX:EAX / EBX,商在EAX,余数在EDX
DIV EBX ; EDX:EAX / EBX,商在EAX,余数在EDX
注意:除法操作前需要设置好EDX:EAX(64位被除数)
🔧 逻辑与移位指令
AND/OR/XOR – 逻辑运算
按位进行与、或、异或操作。XOR常用于寄存器清零。
AND EAX, 0FFh ; 只保留EAX的最低字节
XOR EBX, EBX ; 快速将EBX设为0
XOR EBX, EBX ; 快速将EBX设为0
NOT – 按位取反
把每一位0变1,1变0,就像黑白反转。
NOT EAX ; 对EAX所有位取反
SHL/SHR – 移位操作
左移(SHL)相当于乘以2,右移(SHR)相当于除以2(无符号数)。
SHL EAX, 1 ; EAX左移1位(乘2)
SHR EBX, 2 ; EBX右移2位(除4)
SHR EBX, 2 ; EBX右移2位(除4)
🔄 控制流指令
JMP – 无条件跳转
无条件跳转到指定位置,就像坐飞机直接飞到另一个城市。
JMP label ; 跳转到label标记的位置
CMP – 比较指令
比较两个值并设置标志位,但不改变操作数,为条件跳转做准备。
CMP EAX, EBX ; 比较EAX和EBX
条件跳转 – JE/JNE等
根据标志位决定是否跳转:
JE(相等跳转)、JNE(不等跳转)、
JG(大于跳转)、JL(小于跳转)
JE(相等跳转)、JNE(不等跳转)、
JG(大于跳转)、JL(小于跳转)
CMP EAX, 10
JE equal ; 如果EAX等于10则跳转
JNE not_equal ; 如果EAX不等于10则跳转
JE equal ; 如果EAX等于10则跳转
JNE not_equal ; 如果EAX不等于10则跳转
CALL/RET – 函数调用
CALL调用函数(跳转到函数地址并保存返回地址),RET从函数返回。
CALL my_function ; 调用函数
…
my_function:
…
RET ; 返回到调用位置
…
my_function:
…
RET ; 返回到调用位置
🔍 其他重要指令
TEST – 测试位
类似AND但不保存结果,只设置标志位,常用于测试某位是否为0。
TEST AL, 1 ; 测试AL最低位
JNZ odd ; 如果不是0(奇数)则跳转
JNZ odd ; 如果不是0(奇数)则跳转
LOOP – 循环控制
用ECX作为计数器,每执行一次LOOP,ECX减1,如果ECX≠0则跳转。
MOV ECX, 5 ; 设置循环5次
my_loop:
…
LOOP my_loop ; ECX减1,如果≠0则跳转
my_loop:
…
LOOP my_loop ; ECX减1,如果≠0则跳转
NOP – 空操作
什么也不做,占用1字节空间和1个时钟周期,常用于对齐或占位。
NOP ; 空操作,相当于”休息一下”
🚩 标志位说明
ZF – 零标志
当操作结果为0时,ZF=1;否则ZF=0。用于判断结果是否为零。
CF – 进位标志
无符号数运算产生进位或借位时,CF=1。用于检测溢出。
OF – 溢出标志
有符号数运算结果超出表示范围时,OF=1。用于检测有符号溢出。
SF – 符号标志
当结果为负数时,SF=1;为正数时,SF=0。反映结果的符号。
这些标志位由算术和逻辑指令设置,由条件跳转指令使用