3.7 滴水3
1.详解进位与溢出
2.指令介绍
ADC指令:带进位加法
格式:ADC R/M,R/M/IMM 两边不能同时为内存 宽度要一样
ADC AL,CL
ADC BYTE PTR DS:[12FFC4],2
ADC BYTE PTR DS:[12FFC4],AL
SBB指令:带借位减法
格式:SBB R/M,R/M 两边不能同时为内存 宽度要一样
SBB AL,CL
SBB BYTE PTR DS:[12FFC4],2
SBB BYTE PTR DS:[12FFC4],AL
XCHG指令:交换数据
格式:XCHG R/M,R/M/IMM 两边不能同时为内存 宽度要一样
XCHG AL,CL
XCHG DWORD PTR DS:[12FFC4],EAX
XCHG BYTE PTR DS:[12FFC4],AL
MOVS指令:移动数据 内存-内存
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSB
MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSW
MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSD
例子:
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 观察EDI的值
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
修改标志寄存器中D位的值,然后在执行下面的指令:
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 观察EDI的值
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元
STOS BYTE PTR ES:[EDI] 简写为STOSB
STOS WORD PTR ES:[EDI] 简写为STOSW
STOS DWORD PTR ES:[EDI] 简写为STOSD
MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI] 观察EDI的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
修改标志寄存器中D位的值,然后在执行下面的指令:
MOV EAX,12345678
MOV EDI,12FFC4
STOS BYTE PTR ES:[EDI] 观察EDI的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令
MOV ECX,10
REP MOVSD
REP STOSD
3.一些指令 这些指令用到即查
这些 最好好像是提升堆栈
4.jcc指令
1.JMP 地址
修改eip的值
mov eip,地址
2.call 地址
push b 下一行运行代码的地址
mov eip,地址
3.call~ret
lea esp,esp+4
mov eip,esp-4
2.比较指令
1.cmp指令
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。
只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。
一般用来判断是否想等 然后来跳转
2.test指令
指令格式:TEST R/M,R/M/IMM
该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位.
与的操作表项如下:
1 and 1 = 1
常见用法:用这个指令,可以确定某寄存器是否等于0。
TEST EAX,EAX 观察Z位
但是如果EAX的二进制某些位为1的话,那么运算的结果就不为零。

跳转神图
作业 了解跳转 如何改变标志位
熟悉每一个指令
1.详解进位与溢出
2.堆栈
1.C语言函数介绍
函数:
计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带
有一入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,
供计算机处理,所谓出口,就是指函数的计算结果,也称为返回值,在计算机求得之后,由此口带回给调用它的程序。
1.先进后出
2.向低地址扩展
堆栈为什么需要平衡销毁
为什么保持堆栈平衡
为什么要保证堆栈平衡(保证数据环境)
程序在读写数据的时候是通过地址查找的,如果函数调用之前的堆栈与函数调用之后的堆栈不一致,就可能导致找不到数据或找到的数据错误,那么久有可能导致程序崩溃.
本文来自博客园,作者:逆向狗,转载请注明原文链接:https://www.cnblogs.com/Agtw/p/17187914.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理