1

在处理器中,如何区分数据、地址和指令?执行程序时,当一切都在0s 和1s 中并且寄存器加载数据和地址时,处理器如何区分指令?

4

3 回答 3

6

处理器只做你告诉它做的事情。正如您所指出的,处理器无法区分内存中的“数据”和“代码”:它只是一个字节序列。这就是你告诉它如何处理定义如何处理的那些字节。

编译程序时,生成的可执行文件中包含信息,说明哪些部分是代码,哪些部分是数据。执行程序时,操作系统将代码和数据加载到内存的不同部分,然后告诉处理器在程序的入口点开始执行代码。从那里,处理器获取第一条指令,执行它,然后继续下一条指令。

当然,这一切都非常简化,但我想你明白了。

在较旧的处理器和较旧的操作系统中,没有什么能阻止您告诉处理器开始执行位于数据段中间的指令。或者,事实上,通过修改代码段中间的“数据”——从而制作自修改代码。较新的处理器和操作系统通常具有某种形式的数据执行预防和锁定以防止修改代码。否则,自修改代码可能会成为巨大的安全风险。

简短的回答:处理器将代码视为代码,因为您告诉它这样做。否则,一切都只是内存中的字节。

于 2010-12-14T20:34:33.343 回答
2

各种寄存器帮助处理器区分在计算机上执行的进程中的各种内存段。当程序启动时,代码段寄存器 (cs) 和指令指针 (ip/eip/rip) 设置为指向代码所在的位置,而数据段寄存器 (DS) 和通用寄存器之一(通常为 DX ) 用于指向数据段。嗯,这主要是 Intel x86 架构,但一般来说,大多数架构都有寄存器来区分代码区域和数据区域,还有堆栈段。通过这些寄存器,cpu“知道”或者能够区分代码地址

于 2011-06-28T18:03:32.297 回答
0

当您启动应用程序时,eip(程序计数器)设置为程序的文本数据所在的位置,文本数据是您的代码(0..1)。从这里它开始从放在 eip 上的地址执行指令。如果 CPU 尝试执行不是指令的东西,它会抛出异常(此级别的中断),这些指令是在 cpu(或缓存)附近的 ROM 上定义的。他如何知道它是否是指令,想象一下 foreach 指令是 fetch 他检查 rom like 和 hashtable 以查看它是否是有效指令。

这是解决问题的一种非常简单的方法,因为很多事情都会发生 XDD。

于 2010-12-14T19:45:38.433 回答