在处理器中,数据,地址和指令如何区分?当程序执行时,当所有内容都在0 s and 1
s并且寄存器加载数据,地址时,处理器如何区分指令?
答案 0 :(得分:4)
处理器只执行您要求它执行的操作。正如您所指出的,处理器无法区分内存中“数据”和“代码”之间的区别:它只是一个字节序列。这就是你告诉它如何处理那些定义它如何处理的字节。
编译程序时,生成的可执行文件中包含哪些部分是代码以及哪些部分是数据的信息。当程序执行时,操作系统将代码和数据加载到内存的不同部分,然后告诉处理器开始在程序的入口点执行代码。从那里,处理器获取第一条指令,执行它,然后继续执行下一条指令。
当然,这一切都非常简化,但我认为你明白这一点。
在较旧的处理器和较旧的操作系统中,没有什么可以阻止您告诉处理器开始执行位于数据段中间的指令。或者,实际上,通过修改代码段中间的“数据” - 从而制作自修改代码。较新的处理器和操作系统通常具有某种形式的数据执行防护和锁定,以防止修改代码。否则,自修改代码可能会成为巨大的安全风险。
简短的回答:处理器将代码视为代码,因为您告诉它。否则,一切都只是内存中的字节。
答案 1 :(得分:2)
各种寄存器有助于处理器区分计算机上执行的进程中的各种内存段。当程序启动代码段寄存器(cs)和指令指针(ip / eip / rip)被设置为指向代码所在的位置时,而数据段寄存器(DS)和一个通用寄存器(通常为DX) )用于指向数据段。那么这主要是Intel x86架构,但一般来说,大多数架构都有寄存器来划分代码区域和数据区域,以及堆栈段。通过这些寄存器,cpu“知道”或能够区分代码地址
答案 2 :(得分:0)
当你启动一个应用程序时,eip(程序计数器)被设置为你的程序的文本数据,文本数据是你的代码(0..1)。从这里开始执行来自eip上的地址的指令。指令是在cpu(或缓存)附近的ROM上定义的,如果cpu尝试执行的某些操作不是它抛出异常的指令(此级别的中断)。他怎么知道它是否是指令想象得到的foreach指令他检查rom和hashtable以查看它是否是一个有效的指令。
这是一个非常简单的问题,因为很多事情都发生在XDD上。