反汇编基础-寄存器及内存
PC机中4大存储单元
1.硬盘:长时间大量存储数据,因为硬盘速度慢,在程序运行时就将硬盘中的数据加载到内存中。
2.内存:内存的存储速度比硬盘快,但还是没CPU快。
3.高速缓存:保证CPU的速递,就在CPU中加入了高速缓存,对CPU中的数据进行预读,如果CPU下次运算需要的数据正好在高速缓存中,叫catch命中,否则为catch未命中,需要高速缓存又读取一次,高速缓存一般不需要注意,但要对一个程序进行优化,catch命中也是要考虑的问题。
4.寄存器:CPU中设计的个单元,主要负责在运算时保存数据。
硬盘最慢,并且最便宜,寄存器最快,并且最贵,
【反汇编的过程就是观察计算机运行的过程,特别要注意寄存器与内存】
在X86平台下CPU有10个寄存器
数据寄存器:EAX、EBX、ECX、EDX每个32位长,这32位被分为高16位和低16位【这种设计主要是为了兼容16位的程序】
一般的资料中EAX是累加寄存器,但更具编译器优化策略的不同,使用的寄存器也不同。
ESI、EDI与数据寄存器功能类似;
指针寄存器:ESP、EBP
指针寄存器会分别使用ESP保存当前栈底的地址,而EBP保存当前栈顶的地址;
这不是绝对,在寄存器不够用时也可以拿这两个当成数据寄存器。
下面2个寄存器不能当作数据寄存器:
指令指针寄存器:EIP:存储下一句指令的地址;
标志寄存器:EFlags存储计算结果的状态
【这2寄存器存储的值都有特殊意义,修改后会影响程序的执行流程】
下面是一个加法的实战
PC机中4大存储单元
1.硬盘:长时间大量存储数据,因为硬盘速度慢,在程序运行时就将硬盘中的数据加载到内存中。
2.内存:内存的存储速度比硬盘快,但还是没CPU快。
3.高速缓存:保证CPU的速递,就在CPU中加入了高速缓存,对CPU中的数据进行预读,如果CPU下次运算需要的数据正好在高速缓存中,叫catch命中,否则为catch未命中,需要高速缓存又读取一次,高速缓存一般不需要注意,但要对一个程序进行优化,catch命中也是要考虑的问题。
4.寄存器:CPU中设计的个单元,主要负责在运算时保存数据。
硬盘最慢,并且最便宜,寄存器最快,并且最贵,
【反汇编的过程就是观察计算机运行的过程,特别要注意寄存器与内存】
在X86平台下CPU有10个寄存器
数据寄存器:EAX、EBX、ECX、EDX每个32位长,这32位被分为高16位和低16位【这种设计主要是为了兼容16位的程序】
一般的资料中EAX是累加寄存器,但更具编译器优化策略的不同,使用的寄存器也不同。
ESI、EDI与数据寄存器功能类似;
指针寄存器:ESP、EBP
指针寄存器会分别使用ESP保存当前栈底的地址,而EBP保存当前栈顶的地址;
这不是绝对,在寄存器不够用时也可以拿这两个当成数据寄存器。
下面2个寄存器不能当作数据寄存器:
指令指针寄存器:EIP:存储下一句指令的地址;
标志寄存器:EFlags存储计算结果的状态
【这2寄存器存储的值都有特殊意义,修改后会影响程序的执行流程】
下面是一个加法的实战
【通过阅读程序反汇编后的代码以理解程序的执行流程以及作用】
【注意:在intel系统中栈是向下生长的】
EBP是一个指针寄存器(就能知道是栈区),-8可以知道是一个32位,在栈区创建了一个变量,并且赋值为1,
并且又在栈区创建了一个变量,赋值为2.
然后将第一个变量的值给了EAX数据寄存器,在把第二个变量的值加到EAX寄存器
最后把EAX寄存器的值,写到第一个变量的值里面,
对应的C语言源码如下:
#include <stdio.h>
int main(){
int a = 1;
int b = 2;
a += b;
return 0;
}