指令和数据都用二进制代码存放在内存中,从时空观角度回答CPU如何区分读出的代码是指令还是数据

来源:百度知道 编辑:UC知道 时间:2024/05/13 06:46:01
需要专业完整的答案 简答题 考试 大谢~
各位帮帮忙~

数据,内存中存在的都是数据没有指令,内存本身就是为了缓解处理器的高速和硬盘的低速之间的缓冲,因此全是数据,指令是存在缓存中的,另外指令还存在于专门的寄存器中,因此是不会存在在内存里的。

指令用来确定“做什么”和“怎样做”,数据是“做”的时候需要原始数。

计算机可以从时间和空间两方面来区分指令和数据,在时间上,取指周期从内存中取出的是指令,而执行周期从内存取出或往内存中写入的是数据,在空间上,从内存中取出指令送控制器,而执行周期从内存从取的数据送运算器、往内存写入的数据也是来自于运算器。

比如:要计算机做1+2=?中,“+”表示要做什么和怎样做,1和2则是做的时候需要的原始数。现在假设某CPU中,“+”用二进制“00000001”来表示,“1、2”分别用“00000001、00000010”来表示。那么,这段程序存入内存中就是这样的:
XXXX1:00000001
XXXX2:00000001
XXXX3:00000010 前面的XXXX1 XXXX2
XXXX3表示内存的地址
从上面可以看出,“+”指令和被加数是完全相同的,当然,这是我故意这样假设的,但是,在实际情况中,这种情况是大量存在的。在正常情况下,CPU只能把XXXX1内存中的00000001作为指令,XXXX2内存中的00000001作为被加数才能得到正确的结果。那么CPU如何才能做到不把第二个00000001也当成“+”呢?
1.人们把内存的某个地址规定为起始地址(又称为复位地址),也就是说,当计算机开机或者被强行复位(也就是机箱上那个重启动按钮按下的的时候),CPU立即跳转到这个地址中,并且把它里面的代码作为指令来执行,同时根据这个指令的长度和格式判断下一条指令在什么地方。
对于X86系列CPU(也就是现在人们常用的什么奔XX、赛XX系列),它的复位地址是FFFF0,如果表示成逻辑地址则是:FFFF:0000。对DEBUG比较熟悉的朋友或者会在一些高级语言中嵌入汇编语言的朋友可以这样做一个试验:
用DEBUG执行一条指令(这是一条无条件跳转指令):jmp
FFFF:0000,或者在高级语言中嵌入这条汇编指令,执行后,