有一天,风和日丽,晴空万里,饭后闲来无事,就聊了聊天,聊着聊着就聊到计算机是如何区分指令和数据的问题了。闲聊怎么会聊到这个问题!?可能因为我们虽不是计算机科班出身,但对计算机都有些兴趣。貌似他喜欢主要是PC游戏和一些其他应用,而不是PC本身。好吧,言归正传!
下面,将用M来表示我,用Z标示他。
M:Z哥你知道计算机是如何区分指令和数据的吗?
Z:不知道,没研究过,咋区分?
M:你想想吧。
Z:格式吗?
M:呵呵,你说计算机用什么来存储和处理信息?
Z:二进制0和1,这谁不知道。
M:哦,那000111,你说它是到底是数据还是指令?或者说有没有一个0、1序列即表示指令又表示数据,你再想想吧。
(Z哥沉思了一阵子)
Z:分开存,把指令存到一个地方,把数据存到另一地方。
M:哦,你是想说假设你电脑内存4G,然后2G专门存指令,另外2G专门存数据吗?
Z:恩,没错。
M:那指令2G不够怎么办,数据又用不上2G,你怎么办?
Z:动态调整。
M:你厉害,想法挺接近了,不过我还是要问你,动态调整那不就有回到原先的话题了吗?有些地方既能存数据,又能存指令了。你怎么知道他到底是指令还是数据。
(Z哥沉思之后表示不想和我再谈论这个话题了)
M:格式,空间都区分不开,还有一个你没有想想到就是时间。
Z:时间?
M:就像人一样该睡觉时就睡觉,该吃饭时就吃饭。到取指令时我就取到内存中某个地方去取指令(当然这个地址,既可以存指令也可以存数据)不过计算机此时此刻认定它存的是指令,不管它是不是有效指令,都进行读取了,之后还要执行。所以非常手段篡改程序后,崩溃时提示CPU无效指令,哈哈。到取数据时我就到内存中某个地方取数据,就算你跟某个指令一样,我也把你当成数据(当然了没有无效的数据,只有无意义的数据呵呵,游戏修改器,修改攻击力,经验值,等级,金钱)。到取指令时间取指令的电子元件就会工作(指令寄存器等),到取数据时间取数据的电子元件就会工作(数据寄存器等)。
Z:我有点明白了,照你这么说,到取指令时不一定取的就是指令,不是要经常遇到无效指令吗?
M:不会,首先需要非常手段篡改程序才可以出现无效指令,正常编译器无法编译出无效的指令,只要编译器正常,精神病也写不出无效指令的程序。其次计算机一开机访问BIOS,再之后每条指令执行前,下一条指令的位置就确定了,CPU自动确定的。况且指令在内存中时,此区域一般是只读的不允许修改(存数据一般是可以修改的,要不然针对内存游戏修改器就都报废了)。操作系统会把程序的指令放到一个只读区域,数据放到可读写区域。这个只读属性是操作系统赋予的不是硬件赋予的。程序退出后,其他程序才能利用这块内存区域,不过存数据还指令就不一定了哦。所以不是按空间分的,而是按时间分的。属于我程序的时间,它存的是指令,它只读。同样区域,属于你程序的时间,他存的是数据,它可读写。
———————————————————————————————————————————————————————————————————————————————
我总结的这两个时间,一个是涉及指令周期的概念,一个是涉及操作系统进程相关概念。