Van*_*p95 2 cpu cpu-architecture machine-code
这让我困惑的原因是所有地址都保持1和0的序列.那么CPU如何00000100从00000100(CPU指令)中区分(整数)?
首先,不同的命令具有不同的值(操作码).这就是CPU知道该怎么做的方式.
最后,问题仍然存在:什么是命令,什么是数据?
现代PC正在与von Neumann -Architecture(https://en.wikipedia.org/wiki/John_von_Neumann)合作,其中数据和操作码存储在同一存储空间中.(这两种数据类型之间存在分离的架构,例如哈佛架构)
详细解释所有内容将完全超出stackoverflow的范围,很可能每个帖子的字符数量不足以满足要求.
用尽可能少的单词来回答这个问题(实际上在这个级别上工作的每个人都会因为解释中的捷径而杀了我):
因此,假设应该执行添加,并且您在内存中有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请注意,这是简化的.实际上,CPU需要关于它是否处理值或地址的确切指令.在装配中,这是通过使用完成的
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处的位指示...