反汇编基础-寄存器及内存

反汇编基础-寄存器及内存


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;
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80767407