学习:数学指令
前言:常用的数学指令汇编笔记
add加法指令
之前测试的时候用的都是add eax,0x1
,其实add不仅可以给寄存器的地址加值add eax,0x1
,还可以给取地址的值加值add dword ptr ds:[0x402000],0x2
,也同样可以寄存器给寄存器加值add eax,ecx
,如下图值为4的原因是自己原本就给了2,为什么是第一个为4呢,因为是倒着来的,实际值应该是00000004
sub减法指令
跟上面一样,同样可以进行给寄存器的地址减值sub eax,0x1
,还可以给取地址的值加值sub dword ptr ds:[0x402000],0x2
,也同样可以寄存器给寄存器加值sub eax,ecx
,如下图原本值为4减2了,就自然是2了
adc加法指令
加的时候需要考虑上进位标志CF
1、修改当前地址的汇编指令为adc eax,0x1
2、单步步过
发现eax中的地址值加1
3、把C寄存器置为1
4、修改汇编指令adc eax,0x1
5、单步步过
发现eax的地址值为3,也就是说加了2,所以adc指定加的时候需要考虑上进位标志CF
sbb减法指令
注意:减的时候需要考虑上进位标志CF
1、修改当前地址的汇编指令为sbb eax,0x1
2、单步步过
发现eax中的地址值减1,eax的地址值为2
3、把C寄存器置为1
4、修改汇编指令sbb eax,0x1
5、单步步过
发现eax的地址值为0,也就是说减了2,所以sbb指定减的时候需要考虑上进位标志CF
inc自增指令
1、修改多个连续地址的汇编指令为inc eax,0x1
2、单步步过
那么在C语言中,一个变量的值是存储在相应的内存地址中的,我们也可以尝试实现对地址中的数值进行操作,同样可以通过汇编语言实现inc dword ptr ds:[0x402000]
,这是肯定的
dec自减指令
1、把当前的eax的寄存器中的地址值修改为00001234
3、然后修改多个连续地址的汇编指令为dec eax,0x1
2、继续单步步过
那么在C语言中,一个变量的值是存储在相应的内存地址中的,我们也可以尝试实现对地址中的数值进行操作,同样可以通过汇编语言实现dec dword ptr ds:[0x402000]
,这是肯定的
mul乘法指令(无符号位计算)
这里需要注意的是默认是跟eax寄存器中的地址值相乘
1、修改eax寄存器的地址值为FFFFFFFF,ecx的地址值为5
2、把当前的地址的汇编指令修改为mul ecx
3、单步步过
我们事先知道十六进制5*FFFFFFFF的值为4FFFFFFFB,但是这里发现EAX的值保存的为FFFFFFFB,那4呢,仔细观察可以发现存储到了EDX寄存器中了,所以可以知道如果结果是大于32位的,多出来的存储到其他寄存器中
div除法运算指令(无符号位计算)
这里需要注意的是默认的被除数是eax寄存器中的地址值
第一种:
1、修改eax寄存器的地址值为17,ecx的地址值为5
2、把当前的地址的汇编指令修改为div cl
,cl是ecx中的第四个字节那么也就是05
3、单步步过
会发现十六进制17的十进制为23 然后除以十进制5 商4 余3,在这里的表达方式就是 在eax寄存器中ah中存储着余数,al中存储商
第二种:
1、修改eax寄存器的地址值为17,ecx的地址值为5
2、把当前的地址的汇编指令修改为div cx
,cx是ecx中的后两个字节那么也就是0005
3、单步步过
会发现eax寄存器中的后面存储商,edx寄存器中的dx存储余
第三种:
1、修改eax寄存器的地址值为17,ecx的地址值为5
2、把当前的地址的汇编指令修改为div ecx
,ecx也就是00000005
3、单步步过
会发现结果跟mul cx
一样,但是存放的位置不同,这次存放的是edx完整的位置,也就是32位的地址中
imul乘法指令(有符号位计算)
第一种:单操作符
1、修改eax寄存器的地址值为FFFFFFFB,ecx的地址值修改为5
2、把当前的地址的汇编指令修改为imul cl
,cl也就是05
3、单步步过
发现EAX寄存器的值为FFFFFFE7,有符号位的十进制为-25,因为FFFFFFFB有符号位的十进制就是-5,-5*5=-25
第二种:双操作符
1、修改eax寄存器的地址值为FFFFFFFB,ecx的地址值修改为5
2、把当前的地址的汇编指令修改为imul ax,cx
,意思就是cx也就是0005,结果存储在ax中
3、单步步过
EAX的值为FFFFFFE7,十进制为-25
第三种:三操作符
1、修改eax寄存器的地址值为FFFFFFFB,ecx的地址值修改为5
2、把当前的地址的汇编指令修改为imul ax,cx,2
,意思就是cx也就是0005,结果存储在ax中
3、单步步过
EAX的值为FFFFFFF6,十进制为-10
idiv除法指令(有符号位计算)
自己试的时候有问题,值对不上,先放着吧,等知道了再来填充
xadd交换相加指令
xadd eax ecx
可以理解为 xchg eax,ecx
然后再add eax,ecx
1、修改eax寄存器的地址值为00000001,ecx的地址值为00000004
2、把当前的地址的汇编指令修改为xadd eax ecx
3、单步步过
可以发现先交换了1和4,然后给eax赋值5
neg取反指令
1、修改eax寄存器的地址值为00000005
2、把当前的地址的汇编指令修改为neg eax
3、单步步过
可以发现eax的地址值为FFFFFFFB 转换为十进制为-5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY