汇编网首页登录博客注册
shangzhongyong的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
  • [游客] good 03/07 09:48
好友圈
文章收藏
友情链接

[2009-08-25 16:15] cpu是怎样识别一条接一条的指令的

这个问题也是很有意思的,虽然可能在专业人士看来不算什么。
也有人认为“这种问题真的没什么意义”“这种问题自己去看书吧,三言两语怎么讲得清楚?”但是在我等业余票友的眼里可谓是集难度和趣味于一身了。
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内的电路层识别结构就可能有十几种,逻辑层识别模式也最少有多个.   
-------------------------
评论次数(1)  |  浏览次数(1714)  |  类型(汇编的一些资料) |  收藏此文  | 

[  fpamc   发表于  2012-10-24 07:37  ]

先顶下。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码