学习每个指令注意其指令执行原理,尝试用其他组合指令去替代有利于理解,不要只停留于指令语法!
1、每个应用程序都会有自己的独立的4GB内存空间,汇编中通常说的内存正是这进程对应的内存,而不是物理内存或内存条。
2、32位机上的一块内存的寻址宽度为 0x00000000~0xFFFFFFFF,其中每 0x1中有8 bit,所以这个值正好对应4G内存空间。
3、汇编中 movs 可以将一段内存赋值给另一段内存,而 mov 不行。
4、调试器中F7(单步步入),F8(单步步过)在call指令中存在差异,F8会执行完call指令后接着把直到ret指令的内容全执行完,F7则会在call中单步运行。写许多无用的call和使程序跑飞的call是反调试的基本手段。
5、ESP:栈指针寄存器:堆栈给中间的一些程序存储值。(ESP中的值是堆栈中地址,该地址中储存的值(可能是下一条指令的地址等等))。
6、EIP:不是通用寄存器所以通过汇编(mov)不能修改,但是可用jmp修改;jmp就是用来修改EIP,同时jmp语法中也可以用内存/寄存器/立即数 修改,但似乎内存只能是……dword……(因为EIP就是32位的呀);另一个call也用于修改EIP。call和jmp的唯一区别是call执行时会把call的下一条指令压入堆栈中。
7、单步步入本质上是设置EFLAGS的TF位;而单步步过本质上是在下一行设置断点。断点实际上是设置 int 3 指令,int 3指令的值为0xCC。
8、Dbdebug调试软件中四个模块(反编译、寄存器、内存、堆栈)中内存和堆栈的关系我理解是:堆栈是内存中开辟的一块,由操作系统自动分配,左边的内存地址中只能使用那些被申请过的也就是在右边出现过的内存地址。
9、关于汇编函数中的寄存器传参和堆栈传参。
10、函数堆栈平衡:1) 如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。2) 如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。
11、关于存储模式:80x86架构中多是小段存储,而ARM多是大端储存。