01.汇编学习体会与心得
为了深入学习逆向工程,硬着头皮看起了汇编语言的相关书籍。先是在网上零星的查找相关资料与各种汇编命令的含义。效果就是基本看了就忘,忘了再查。然后从网上下载了一本叫《汇编语言》的书籍,还是比较适合入门的。竟然还有习题与作业,这本书大致都是在早晨起床的半个小时到一个小时之内的时间里阅读,感觉有点回到学生时代了。书翻了一半才感觉到一丝不对劲,书中所讲解到的寄存器全是ax、bx、cx、dx,与我能接触到的汇编代码里用的R0、R1、R2、R3名称完全不一致。这时我才意思到这是一本针对windows平台的书籍,而移动端毫无疑问是ARM平台。真是欲苦无泪啊,好在总体思想是相通的。自己约的炮,含着泪也要打完,先看完这本书再说吧。下面就汇编中数据的存贮说一下自己的学习心得。
以我现在的知识范围来说,汇编中数据存贮主要有寄存器、内存、栈三种形式。数据在这三种方式之间流转传递,通过CPU的运算,达成最终的计算成果并展示给用户。
寄存器是隶属于CPU的存贮结构,可以分为普通寄存器、段寄存器、栈地址寄存器等几种形式。是CPU运算时操作最频繁、最快速的一种方式。普通寄存器可以简单类比为C语言中的变量,用于暂时存储计算过程中需要短暂保存数据。段寄存器主要用来指示下一个要执行的指令地址,有段地址寄存器与偏移地址寄存器,二者通过算法段地址*16+偏移地址共同决定下一条指令的地址。因此汇编中的所有跳转指令应该都是通过改变这两个寄存器的值来决定程序的跳转行为的。栈地址寄存器的主要用来做堆栈操作,同段寄存器类似,栈寄存器也分成基址寄存器与偏移寄存器两种,后面讲堆栈时再详细说明。
内存是程序运行过程中最大的存在结构,对一个程序来说,内存是由操作系统随机分配的,因此它的起始地址是随机分配的,但内存的大小却是由程序自身决定的。因为程序要运行起来,必须由操作系统将其可执行的二进制文件整体加载到内存中。可执行的二进制文件中包含了程序的代码段、数据段等。而上面的段寄存器就是定位这些内存的主要方式,通过段寄存器,CPU可以将使用普通寄存器读取或者改变内存中的数据。
栈实质上也是内存的一种,但与内存不同的是,栈是FILO的,而内存是可以随机读写的。当然同内存一样,栈也是由操作系统生成的。栈主要用于函数调用或返回时保存环境。
关于汇编后续希望能同样保持一周一更的频率,希望能尽快的融会贯通,不在为ida中乱其八遭的汇编代码而头大。