汇编指令学习与总结CMP,TEST,JE,JNZ,JNE,LEA,MOVE,SUB,INC,DEC,ADD,MUL,DIV,JGE,JB ,CQD

本文详细解析了逆向微信过程中遇到的多种汇编指令,包括比较、跳转、加载、移动、算术运算等核心操作。通过具体实例解释了指令的功能与使用场景,适合初学者理解和学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所有的汇编都是我零基础逆向微信汇编的指令 边玩边学(左边有 机器码,自己可以查 位置)
如有不对的地方请指出

注明:一些指令的英文单词,并非官方,只是为了好记好理解

注意:无符号数的比较用高于和低于,有符号数的比较用大于小于

1.cmp【compare】指令
进行比较两个操作数的大小

例:cmp oprd1,oprd2  // 执行oprd1-oprd2  操作,不过不保存结果,只影响标志位。

为第一个操作减去第二个操作数,但不影响第两个操作数的值,它影响flag的CF,ZF,OF,AF,PF.
如果减数大于被减数,此时有借位。则将cf位置1,否则置0.
2.test与JE【jump When Equal】指令
test 指令用于两个操作数的按位AND运算,并根据结果设置标志寄存器,结果本身不会写回到目的操作数。
通俗点来说 .test非常普遍的用法是用来测试寄存器是否为空: 寄存器为空, 则ZF零标志为1,则跳转
JE 当ZF标志位为零,就跳转

66E9419A    85DB            test ebx,ebx
66E9419C    74 64           je short WeChatWi.66E94202 //这两句含义为:ebx寄存器为空,就跳转

3.JNZ【jump no Zero】与JNE【jump no Equals】
都依据ZF标志位(我经常叫做 零标志位,判断是不是0) 不为0/不等于时跳转执行
通俗来说: 这两条指令完全没区别! 它们对应于完全相同的机器代码,含义为ZF标志位不等于0 则执行

66E6F4C8    66:8338 00      cmp word ptr ds:[eax],0x0
66E6F4CC    75 05           jnz short WeChatWi.66E6F4D3 //这两句含义为eax寄存器不等于0则跳转

4.LEA【load(加载) Effective(有效) Address(地址) 传送的是值 **
格式: LEA 操作数A, 操作数B
功能: 将操作数B的有效地址传送到指定的的某个寄存器,操作数A必须是寄存器
LEA AX,[SI],作用是将寄存器SI的
内容4567H当做数据**传送给AX;
自我感觉来说:用来提升堆栈或者来获取某个值所对应的内存地址(有异议请评论区哈)

66E6F4B0    8D45 E0         lea eax,dword ptr ss:[ebp-0x20]
//这句的意思时 将ebp寄存器的地址减去0X20 的 内存地址的值,赋值给eax寄存器

5.MOV【move 】 传送的是地址
MOV指令是数据传送指令,用于将一个数据从源地址传送到目标地址(移动/赋值)

MOV AX,[SI],作用是将寄存器SI的内容4567H当做地址看待,将地址为4567H处的内容传送给AX;

66E6F94F    8941 08         mov dword ptr ds:[ecx+0x8],eax //将Eax寄存器的值  赋值给  ecx+0x8这个内存地址 指向的值
66E6F952    8BCE            mov ecx,esi//将esi寄存器的32位数据传送到ecx寄存器 

6.ADD(加),SUB(减),MUL(乘),DIV(除) 原理一样

ADD ax,9 含义为 ax = ax+9
sub ax,9   含义为: ax = 9-ax
sub ax,bx 含义为:  ax = bx - ax 

imul 有符号乘法
mul 无符号乘法
举例

mov ebx,3 //将3送入到 ebx寄存器
imul ebx // 只有一个源时,默认是 ebx 乘与 eax 

7.inc【increase 1 】,dec【decrease 1】
自增1,自减1

inc a 相当于 add a,1 //i++
优点 速度比sub指令快,占用空间小
dec a 相当于 sub a,1 
优点 速度比sub指令快,占用空间小

8.jge【jump when greater or equal】大于或者等于
两个标志位sf和of 转移条件sf异或of=0

0040B780   cmp         dword ptr [ebp-24h],1Eh     
0040B784   jge         main+40h (0040b790)  //这两句的含义为 ebp-24H 大于等于1EH就执行跳转

9.JB(jump not above and equal )低于,即不高于且不等于则转移

//假设 edx =A  eax = 0, 跳转实现
00401354   .  3955 F0       cmp eax,edx
00401357      72 07         jb short 硬编码寻.00401360

但执行这条语句之前先用CMP来比较2个无符号数,CMP比较无符号数后影响的是CF,所以JB应该是通过CF来判断的
(注意:无符号数的比较在这里用高于和低于,有符号数的比较在这里用大于小于)

10 CQD
二进制数的 最高位是0 代表正数 1代表负数
cqd 如下方图那样: 当eax 最高位是 0时, edx = 0000 0000,
当eax 最高位是 0时, edx = FFFF FFFF,
CDQ 这个指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上。 它大多出现在除法运算之前。它实际的作用只是把EDX的所有位都设成EAX最高位的值。也就是说,当EAX <80000000, EDX 为00000000;当EAX >= 80000000, EDX 则为FFFFFFFF。
当eax 是正数时:
在这里插入图片描述
当eax 是负数时:
在这里插入图片描述
汇编指令的全拼 有很多,放到了doc中,附连接
链接: https://pan.baidu.com/s/17ngnluFDW_cSJOnqACE2sg 提取码: m2cc 复制这段内容后打开百度网盘手机App,操作更方便哦

<think>嗯,用户想了解汇编指令有哪些,并且要详细介绍。首先,我得回忆一下汇编语言的基本结构。汇编指令是计算机底层操作的直接体现,通常包括操作码和操作数。不同的架构,比如x86、ARM,指令集可能不同。需要先说明常见的分类,然后每个类别举例子。 用户可能对计算机组成或逆向工程感兴趣,或者是学习底层编程的学生。需要确保解释清晰,避免使用过多专业术语,但又要准确。可能用户需要知道指令的类型,比如数据传输、算术运算、逻辑运算、控制转移、处理器控制等。 接下来,要分点详细说明每个类别。比如数据传输指令有MOV、PUSH、POP,算术运算如ADDSUB,逻辑运算如AND、OR。控制转移如JMP、CALL。还有比较指令CMP,移位指令SHL、SHR。可能需要提到不同架构的区别,比如x86和ARM的区别,但用户没有指定架构,所以可以通用介绍,或者说明常见的x86例子。 要注意用户可能不知道不同架构的差异,所以需要指出指令集依赖于架构。另外,伪指令也需要提及,比如DB、DW,这些在汇编器中用于数据定义。例子部分要具体,比如MOV AX, 5,说明操作数的位置。 还要注意格式要求,行内公式用$...$,独立公式单独成段。不过这个问题可能涉及较少的数学表达式,但如果有涉及,比如位移运算,可能需要用LaTeX表示,比如逻辑左移SHL AX, 1对应AX = AX * 2^1。检查是否有需要公式的地方,并正确应用格式。 最后,结构要清晰,分点列出每个指令类别,每个类别下举几个例子,并说明作用。确保覆盖主要类型,如数据传输、算术、逻辑、控制转移、处理器控制、比较、移位,以及伪指令。同时,提醒读者注意架构差异和伪指令的概念。可能需要总结汇编指令的重要性和应用场景,帮助用户理解为什么需要学习这些。</think>汇编指令是计算机底层硬件直接执行的机器指令的助记符表示。其分类和功能如下(以x86架构为例): $$ \begin{aligned} &\text{汇编指令体系} \\ &\quad \text{1. 数据传输指令} \\ &\quad \text{2. 算术运算指令} \\ &\quad \text{3. 逻辑运算指令} \\ &\quad \text{4. 控制转移指令} \\ &\quad \text{5. 处理器控制指令} \\ &\quad \text{6. 比较测试指令} \\ &\quad \text{7. 移位循环指令} \\ &\quad \text{8. 伪指令(汇编器指令)} \end{aligned} $$ 一、**数据传输指令** - `MOV`:基本数据传送,如 `MOV AX, 5` 将立即数5存入AX寄存器 - `PUSH`/`POP`:栈操作,如 `PUSH BX` 将BX寄存器值压入栈 - `LEA`:取有效地址,如 `LEA SI, [BX+DI+20]` 计算内存地址 - `XCHG`:交换数据,如 `XCHG AX, BX` 交换两个寄存器的值 二、**算术运算指令** - `ADD`/`SUB`:加减运算,如 `ADD CX, DX` 实现CX = CX + DX - `MUL`/`DIV`:乘除运算,`MUL BL` 执行AL * BL(结果存AX) - `INC`/`DEC`:自增自减,如 `INC WORD PTR [SI]` 使内存单元的值+1 三、**逻辑运算指令** - `AND`/`OR`/`XOR`:逻辑/或/异或,如 `AND AL, 0FH` 取低4位 - `NOT`:按位取反,如 `NOT AX` 对AX寄存器所有位取反 四、**控制转移指令** - `JMP`:无条件跳转,如 `JMP 1000H` 跳转到指定地址 - `CALL`/`RET`:子程序调用返回 - 条件跳转: ```assembly CMP AX, BX JE Equal ; 相等时跳转 JNE NotEqual ; 不等时跳转 ``` 五、**处理器控制指令** - `STI`/`CLI`:设置/清除中断标志 - `HLT`:暂停处理器 - `NOP`:空操作(常用于时序调整) 六、**比较测试指令** - `CMP`:比较操作数,如 `CMP AL, 10` 设置标志位 - `TEST`:位测试,如 `TEST AL, 01H` 检测最低位是否为1 七、**移位循环指令** - `SHL`/`SHR`:逻辑左/右移,如 `SHL AX, 1` 等价于 $AX = AX \times 2^1$ - `ROL`/`ROR`:循环左/右移,带进位位的循环移位 八、**伪指令(汇编器指令)** - `DB`/`DW`:定义字节/字数据,如 `MSG DB 'Hello', 0` - `EQU`:符号常量定义,如 `PORT EQU 3F8H` - `SEGMENT`/`ENDS`:定义内存段结构 **注意事项**: 1. 不同架构(x86、ARM、MIPS)的指令集存在差异 2. 现代CPU通过流水线、超标量等技术优化指令执行 3. 组合指令如 `LOOP` 实际是 `DEC CX` + `JNZ` 的复合操作 **应用示例**(两数相加): ```assembly MOV AX, 1234H ; 加载第一个数 MOV BX, 5678H ; 加载第二个数 ADD AX, BX ; 计算结果存入AX ``` 理解汇编指令需要结合寄存器结构、内存寻址方式和标志寄存器状态。建议使用调试器(如GDB)单步观察指令执行效果,这是掌握汇编的最佳实践方法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值