CPU如何知道RAM中的地址是否包含整数,预定义的CPU指令或任何其他类型的数据?

Van*_*p95 2 cpu cpu-architecture machine-code

这让我困惑的原因是所有地址都保持1和0的序列.那么CPU如何0000010000000100(CPU指令)中区分(整数)?

dog*_*ose 5

首先,不同的命令具有不同的值(操作码).这就是CPU知道该怎么做的方式.

最后,问题仍然存在:什么是命令,什么是数据?

现代PC正在与von Neumann -Architecture(https://en.wikipedia.org/wiki/John_von_Neumann)合作,其中数据和操作码存储在同一存储空间中.(这两种数据类型之间存在分离的架构,例如哈佛架构)

详细解释所有内容将完全超出stackoverflow的范围,很可能每个帖子的字符数量不足以满足要求.

用尽可能少的单词来回答这个问题(实际上在这个级别上工作的每个人都会因为解释中的捷径而杀了我):

  • 存储器中的数据存储在某些地址中.
  • 每个CPU建议基本上由3个不同的地址组成(非值 - 只是地址!):
    • 关于该怎么做的地址
    • 关于价值的论点
    • 关于额外价值的地址

因此,假设应该执行添加,并且您在内存中有3个地址,应用程序将存储(如果是5+7)(我使用"动词"作为指示)

Adress | Stored Value
1      | ADD
2      | 5
3      | 7
Run Code Online (Sandbox Code Playgroud)

最后,CPU接收到指令1 2 3,这意味着ADD 5 7(这些事情对命令敏感![命令] [v1] [v2])......现在情况变得复杂了.

CPU会将这些值(实际上不是值,只是值的地址)移动到其寄存器中,然后对其进行处理.要选择的确切寄存器取决于数据类型,数据大小和操作码.

在命令的情况下#1 #2 #3,CPU将首先读取这些存储器地址,然后知道ADD 5 7所需.

基于ADDCPU 的操作码将知道:

  • 将地址#2放入r1
  • 将地址#3放入r2
  • 读取存储器值存储在r1中的地址
  • 读存储在存储在r2中的地址的值
  • 添加两个值
  • 在内存中的某处写入结果
  • 存储我将结果放入r3的地址
  • 将存储在r3中的地址存储到存储在r1中的存储器地址中.

请注意,这是简化的.实际上,CPU需要关于它是否处理地址的确切指令.在装配中,这是通过使用完成的

  • eax(表示存储在寄存器eax中的值)
  • [eax](表示存储在寄存器eax中的地址存储在内存中的值)

CPU无法对存储在存储器中的值执行计算,因此将值从存储器移动到寄存器以及从寄存器移动到存储器非常繁忙.

即如果你有

eax = 0x2
Run Code Online (Sandbox Code Playgroud)

并在记忆中

0x2 = 110011
Run Code Online (Sandbox Code Playgroud)

和指示

MOV ebx, [eax]
Run Code Online (Sandbox Code Playgroud)

这意味着:将当前存储在当前存储的地址中的值移动eax到寄存器中ebx.最后

ebx = 110011
Run Code Online (Sandbox Code Playgroud)

(这种情况每时都会发生CPU进行一次计算!内存 - >注册 - >内存)

最后,要求苛刻的应用程序可以读取其预定义的存储器地址#2,从而产生地址#2568,然后知道计算的结果存储在地址#2568.阅读该地址将导致价值12(5 + 7)

这只是一个很小的例子.有关此内容的更详细介绍,请参阅http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

人们无法真正掌握数据移动量和为简单添加2个值所做的计算.做什么CPU(在纸上)只需几分钟来计算"5 + 7",因为没有"5"而没有"7" - 一切都隐藏在内存中的地址后面,指向一些位,导致不同的值取决于地址0x1处的位指示...