这个问题也是很有意思的,虽然可能在专业人士看来不算什么。
也有人认为“这种问题真的没什么意义”“这种问题自己去看书吧,三言两语怎么讲得清楚?”但是在我等业余票友的眼里可谓是集难度和趣味于一身了。
http://topic.csdn.net/t/20041111/19/3544828.html
(起因是刚才在论坛上看到的一个问题。
CPU 是如何取内存中的指令的?? 疑惑在指令长度不等,是如何实现的。
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=free&kind=1020&qkSg=2&qID=40420&readSg=1
)
先看两条搞笑的答案
书籍推销商的答案:
《计算机系统组成与体系结构》
http://www.china-pub.com/computers/common/info.asp?id=13380
这本书上说的非常清楚
外交辞令式的答案:
就象人看书一样,每个词的长度不一样,但是你可以分辨得出来。因为你会断句,同样的,CPU会解释指令。
稍微整理一下CSDN帖子中的答案放在这里。
数据和指令都是存放在内存单元中的,CPU是分辨不出来的,从一个内存单元读出0-1串,CPU仅仅可以分辨出来这个0-1串在CPU指令集中是存在还是不存在。如果存在就执行,否则就会产生非法指令的错误。
----------------------
现在的CPU多数采用可变长指令系统。关键是指令的第一字节。
当CPU读指令时,并不是一下把整个指令读近来,而是先读入指令的第一个字节。指令译码器分析这个字节,就知道这是几字节指令。接着顺序读入后面的字节。每读一个字节,程序计数器PC加一。整个指令读入后,PC就指向下一指令(等于为读下一指令做好了准备)。
----------------------
正如楼上所比喻的,只要是一段正确的代码,放入内存后,从"第一个"字节(由操作系统定位)读起肯定是指令,只要读到了指令,后面的内容是另一条指令还是本指令的操作数就不言而喻了。
至于CPU如何读懂指令的,当然CPU的设计者是动过一番脑筋的,按理说我们信任他们就行了。
8088指令的长度可以是1~7个字节,其中的操作码1~3字节,其余的操作数部分有多长就看是什么寻址方式了。
8088的大多数指令的操作码是两个字节,如果指令指明了段跨越,则在这两个字节前就会插入一个字节,用来指出段。格式如下:"001SEG110",SEG=00:ES;SEG=01:CS;SEG=10:SS;SEG=11:DS。
怎么样?看出这个字节的特征了码?(Intel公司保证不会有哪条指令的的操作码和它一样!)
下面说说一般指令的格式:
1,一个操作数:指令第一个字节的Bit0~Bit6是操作码,Bit7用来标明是8位还是16位操作数。第二个字节格式如下:MOD xxx R/M。MOD指明第一个操作数在存储器(MOD=00~10)或在寄存器(MOD=11),中间的三位仍然留给操作码,R/M(共三位)给出存储器寻址的基址或给出寄存器的位置(如AL、AX等)。后面跟着的两个字节当然就是操作数了(一般以偏移地址的形式给出)。
2,两个操作数:指令第一个字节的Bit0~Bit5是操作码,Bit6标记:第一个操作数是目的操作数(=0)或第二个操作数是目的操作数(=1),Bit7标记:是8位数(=0)16位数(=1)。第二个字节格式如下:MOD REG R/M。REG=000~111指出是哪个寄存器(如AL、AX等)。
按理说两个字节可以安排65536条不同的指令,但实际上没这么多,大概就是为了避免指令雷同冲撞,呵呵,您不妨充分相信 Intel 的工程师吧。
----------------------
经典奔腾有两个8kb(可扩充为12kb)的高速缓存
现在的cpu已经都是数据和指令分开存放的哈佛结构了
首先是常用指令固化,即把常用的指令例如mov,add,inc,dec,push,pop,jmp,call,nop,test等指令改用硬件实现,不再使用微代码操作,以使指令的操作速度进一步加快;其次每条指令根据寻址方式都有固定的字节长度,cpu每次读入一个字节,都会判断这个字节能不能作为一条完整的指令,如果不能,就在读入一个字节进入指令缓存,一直到能够组成完整的指令为止.
其实这些都还是高层的解释,要是想再到底层一些区理解cpu的执行就需要一些基础的数电知识了,移位寄存器肯定是最重要的了,每八个D触发器锁存一个字节二进制码,当总线时钟产生跳变的时候,D触发器内数据左移或右移,从而控制输出和输入,整个字节移入指令缓存,cpu还要经过比较器,译码器等操作判断指令对应的操作,在下一个总线时钟到来的时候开一些锁存、关一些锁存,然后是极端繁琐的门阵列逻辑,达到用户的需求。
我有幸见过p4的版图,虽然只有短短的几秒钟,但绝对是震撼的!好像是6层立体层叠结构,Intel的光刻工艺绝对先进才能实现90纳米的mos导电沟道(不是说Intel已经有了超紫外线光刻工艺了吗)。
至于搂住的问题,我也没有办法再做出深入而通俗的回答了,因为关于cpu,关于超大规模集成电路(VLSI)我也还在学习中
----------------------
设计CPU中的一条是选好指令集,而指令集的选择主要源于三个方面:
1.指令格式,如是RISC的就是定长了,后期的(586)的INTEL采用了CISC转换成RISC的电路(内核,我不喜欢这个词).
2.指令格式:包括帧格式定义,长度等
3.寻址数等
至于楼上说的识别模式,那应该是电路的事,逻辑层史对帧结构运算,也主要由电路(硬件)完成.而对编码操作,则是在指令层完成,主要是由指令池产生的"硬件过滤"(不是很准确哟)产生识别,而识别的方法是由设计者确定的,在逻辑层完成.不一定是帧首方式,识别类型较多,一个CPU内的电路层识别结构就可能有十几种,逻辑层识别模式也最少有多个.
-------------------------
- [fpamc] 先顶下。 10/24 07:37
- [mess] 下面这个贴子不错,建议博主看看。 【灌顶】学习汇编的重要意义!!http://www.asmedu 09/14 14:47
- [shangzhongyong] 训练营的事情我不知道的说,我参加的是汇编的学习,热心人挺多的。 08/26 19:58
- [游客] 不知道训练营到底是怎么回事,为什么半年多了也没动静,办不下去的话也请管理员通知大家。 08/26 16:45
- [shangzhongyong] 恩,怎么说呢,这个和具体的知识点无关,是看不进去了的说,遇到了兴趣瓶颈。所以先跳过这一部分到后面比较 08/25 13:46
- [mywiil] 千万不能跳过,把你不能够确认的知识点拿出来大家讨论,必须掌握当前内容后才能向后进行。 08/24 13:48
- [shangzhongyong] 24h? 这里先放一个疑问,是不是栈有什么比较微妙的动作 08/24 08:43
- [tinyparticle] (2)sp取值有误 08/22 02:52
- [mywiil] 哦!!! 没看明白那个图。还真么去探索过汇编语言的历史。 08/20 15:14
- [younggay] 博主的理解都没问题,尤其第一题做的很有创意。 08/19 09:13
- [游客] good 03/07 09:48