码迷,mamicode.com
首页 > 数据库 > 详细

程序运行基本概念和认识OllyDbg 一

时间:2021-05-25 18:01:15      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:架构   意义   bsp   自动   指标   poi   漏洞   ollydbg   count   

程序运行的基本概念:

从微处理器出发来解释:
微处理器里有译码器和运算器,只要译码器能吃进指令,运算器能吃进数据,就能输出结果,这样微处理器就是执行了程序。这里微处理器必须一口一口的吃进指令,吃进数据,再一口一口的输出结果。这个一口一口,在时间上就是一个时钟周期,在大小上就是一次能传送的数据量。所以时钟频率和运算位宽是微处理器性能的两个重要指标。

译码器和运算器怎么吃到指令或数据呢?
是用PC指针取指令喂给译码器吃。
指针的概念是:有个寄存器(或缓存)里存的数据一定是当地址去使用,而该地址上存的数据就是最终被用到的,一定有某种方式能让微处理器根据这个寄存器(或缓存)里存的地址去取地址上的数据,这种寄存器(或缓存)就是指针。说白了就是能存地址的缓存,还能有办法让微处理器用这个缓存取到那个地址上的数据,这个缓存就成了指针。
微处理器里放指令所在地址的寄存器就是PC指针(programcounter),programcounter硬翻成中文就是“程序计数器”。
微处理器里一般有专门放指令和数据的寄存器,这些寄存器都是可用指令控制读写的,各种微处理器的这些寄存器有些细节上的不同,大部分是类似的。(Java虚拟机只使用四个寄存器,没有指令和数据寄存器)
数据寄存器一般有多个,名字各有千秋,这些数据寄存器里的数据就喂给了运算器。译码器把PC指针里的地址上所存的数据解码为相应的逻辑操作,根据指令可能会动用运算器里相应的某部分逻辑电路来实现数据的运算和赋值。

微处理器如何执行程序?
程序运行换句话说就是一条条指令由PC指针来执行,把这些指令按逻辑一条条码好,就写成了汇编。所以要想熟悉微处理器的执行程序细节,指令是不可回避的一课。
具体微处理器的架构不一样,指令概念和意义也不一样,微处理器厂家给出的指令分类也不一样,像CISC(复杂指令集计算机)和RISC(精简指令集计算机)两大类CPU架构的指令集就颇有差异。
指令分类没必要太细,笼统的分清指令概念和脉络即可,不论CISC和RISC,指令大致有如下几类:1. 运算类指令;2. 值比较类指令;3.寻址跳转类指令;4. 赋值传送类指令;5. 特殊控制类指令;6. 协处理器扩展类指令。
......
寻址跳转类泛指各种有或无条件的地址跳转。
协处理器是指一些微处理器用额外的大规模逻辑电路来强化某特定的功能,因此往往在原有指令基础上新添一套协处理器指令。
除寻址跳转指令外,还有一类特殊情况会让PC指针发生跳转,这类特殊情况通常是由硬件逻辑控制的跳转,一般微处理器厂商称这类情况叫exception(异常),中断是异常情况的一种,如果送的指令或数据超出了微处理器的处理范围,也都属于异常情况。

异常发生后,微处理器一般能自动备份异常发生前一刻的关键寄存器到备份空间比如备份寄存器或堆栈,并且自动有相应的一些处理器状态及其寄存器的改变,然后将PC指针的地址自动(这里的自动指的是不需要软件参与)切到指定的地址。而在微处理器自动处理异常之后,也就是在PC指针被切到特定地址之后,后续的异常处理根据情况就可能要由软件来继续完成,所以特定地址上的程序就必须按微处理器设计的规范来写,否则相应的异常处理程序就无法继续正常执行完。

程序员需要对微处理器有什么样的理解?
微处理器里除了有PC指针,指令寄存器,数据寄存器,一般还有堆栈寄存器,状态寄存器,以及某些高级控制寄存器等。

堆栈寄存器(stack pointer)的数据也是个地址,该寄存器可以被指令直接读写,但这个寄存器最重要的功能,是执行某些指令,将一些指定的数据以堆栈的形式写到指定的一些连续地址上去。堆栈寄存器有两个专业指令:压栈(推入、push)和出栈(弹出、pop),当软件使用push指令时,被push的数据就存入了堆栈寄存器里存的那个地址上,并且该堆栈寄存器里的地址值会自动变为下一个顺序地址;当软件使用pop指令时,堆栈寄存器里存的那个地址上的数据就会自动被读出,堆栈寄存器里的地址值会自动变为上一个顺序地址。

堆栈寄存器是专门给软件使用的,这样软件就可以利用微处理器的堆栈寄存器,动态的反复使用同一片连续存储空间,这片存储空间就叫堆栈空间。在软件运行过程中,软件的很多临时数据都可以往堆栈中塞,可节省很多存储空间。堆栈的大小以及堆栈所在的地址范围都由软件决定,当软件给堆栈寄存器赋值时,就叫初始化堆栈。如果软件设计的有漏洞(bug),导致堆栈寄存器中的值超出了软件设计的堆栈地址范围,就可能错误的改写了堆栈之外的地址上数据,最终使用该数据的程序就很可能出错,这种错误一般叫堆栈溢出。通常微处理器对这种错误既不报错也不提示,需要程序员自想办法查,然后改软件来解决。

状态寄存器或控制寄存器一般用来切换微处理器的内部功能或状态,从而达到让软件控制微处理器的某些处理功能或者说是解码功能。比如状态寄存器可以控制微处理器处理指令的权限,在某种状态下,某些指令就不能执行,或者说执行的结果就和另一种状态下该指令的结果不同。一个现代意义的微处理器必须至少有两种状态来满足运行现代操作系统所需的系统权限管理。

有的微处理器为了在某些时候能自动保存某些寄存器的数据,还设计了一些备份寄存器来自动备份诸如PC指针,状态寄存器等等。在执行某些指令的时候,PC指针或状态寄存器里的数据,会根据实际需要选择相应的寄存器由硬件做自动拷贝到相应的备份寄存器。比如保存PC现场到堆栈的概念就是把PC指针和数据寄存器里的一些数据全部拷贝进堆栈。

 

程序运行从OS出发来解释,下一篇。。。

程序运行基本概念和认识OllyDbg 一

标签:架构   意义   bsp   自动   指标   poi   漏洞   ollydbg   count   

原文地址:https://www.cnblogs.com/ltyan/p/14806930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!