汇编指令学习指南

汇编指令学习指南 – 编程小白必备

汇编指令学习指南

编程小白也能看懂的常用汇编指令详解,用最通俗的语言解释底层原理

EAX

累加寄存器
用于算术运算

EBX

基址寄存器
存储内存地址

ECX

计数寄存器
用于循环计数

EDX

数据寄存器
I/O操作辅助

ESI/EDI

源/目标索引
用于字符串操作

📦 数据传送指令

MOV – 数据搬运工

把数据从一个地方搬到另一个地方,就像用快递把包裹从A点送到B点。
MOV EAX, 10 ; 把数字10放进EAX寄存器
MOV EBX, EAX ; 把EAX的值复制到EBX

PUSH/POP – 栈操作

像往箱子里放书(PUSH)和取书(POP),遵循”后进先出”原则。
PUSH EAX ; 把EAX的值放入栈顶
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

INC/DEC – 自增自减

给寄存器加1或减1,相当于C语言的++和–操作。
INC ECX ; ECX加1
DEC EDX ; EDX减1

MUL/DIV – 乘除法

MUL是无符号乘法,DIV是无符号除法。乘法结果可能占用两个寄存器。
MUL ECX ; EAX * ECX,结果在EDX:EAX
DIV EBX ; EDX:EAX / EBX,商在EAX,余数在EDX
注意:除法操作前需要设置好EDX:EAX(64位被除数)

🔧 逻辑与移位指令

AND/OR/XOR – 逻辑运算

按位进行与、或、异或操作。XOR常用于寄存器清零。
AND EAX, 0FFh ; 只保留EAX的最低字节
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)

🔄 控制流指令

JMP – 无条件跳转

无条件跳转到指定位置,就像坐飞机直接飞到另一个城市。
JMP label ; 跳转到label标记的位置

CMP – 比较指令

比较两个值并设置标志位,但不改变操作数,为条件跳转做准备。
CMP EAX, EBX ; 比较EAX和EBX

条件跳转 – JE/JNE等

根据标志位决定是否跳转:
JE(相等跳转)、JNE(不等跳转)、
JG(大于跳转)、JL(小于跳转)
CMP EAX, 10
JE equal ; 如果EAX等于10则跳转
JNE not_equal ; 如果EAX不等于10则跳转

CALL/RET – 函数调用

CALL调用函数(跳转到函数地址并保存返回地址),RET从函数返回。
CALL my_function ; 调用函数

my_function:
  …
  RET ; 返回到调用位置

🔍 其他重要指令

TEST – 测试位

类似AND但不保存结果,只设置标志位,常用于测试某位是否为0。
TEST AL, 1 ; 测试AL最低位
JNZ odd ; 如果不是0(奇数)则跳转

LOOP – 循环控制

用ECX作为计数器,每执行一次LOOP,ECX减1,如果ECX≠0则跳转。
MOV ECX, 5 ; 设置循环5次
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。反映结果的符号。
这些标志位由算术和逻辑指令设置,由条件跳转指令使用

💡 学习汇编语言的关键:理解寄存器内存地址标志位的关系

🔧 实践建议:使用调试器(如GDB)单步执行观察寄存器和内存变化

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部