困感己久---cpu是怎样识别一条接一条的指令的?

xiaowenwen 2004-11-11 07:32:57
指令在存储器中是以0和1存放的,并且各指令不等长,那么我想知道的是cpu怎么知道多长的一个0、1组成的串组成一条指令啊?每条指令的首尾相接,怎么识别各条指条的始末啊?
...全文
1200 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
acev 2004-11-26
  • 打赏
  • 举报
回复
Frank_Xu()
您是以前常在VB的Frank_Xu?现在研究汇编了啦?:)
CloneCenter 2004-11-25
  • 打赏
  • 举报
回复
就象人看书一样,每个词的长度不一样,但是你可以分辨得出来。因为你会断句,同样的,CPU会解释指令。
Frank_Xu 2004-11-25
  • 打赏
  • 举报
回复
顶一下
xiaowenwen 2004-11-22
  • 打赏
  • 举报
回复
就照楼上说的,可是cpu怎么知道操作码到哪结束呢?
Gujianda 2004-11-22
  • 打赏
  • 举报
回复
哈哈,我是想来混几个分的,[hswxf(雪山爆发)]才是正解!虚心学习....
ovmem 2004-11-22
  • 打赏
  • 举报
回复
学习ing
hswxf 2004-11-22
  • 打赏
  • 举报
回复
设计CPU中的一条是选好指令集,而指令集的选择主要源于三个方面:
1.指令格式,如是RISC的就是定长了,后期的(586)的INTEL采用了CISC转换成RISC的电路(内核,我不喜欢这个词).
2.指令格式:包括帧格式定义,长度等
3.寻址数等

至于楼上说的识别模式,那应该是电路的事,逻辑层史对帧结构运算,也主要由电路(硬件)完成.而对编码操作,则是在指令层完成,主要是由指令池产生的"硬件过滤"(不是很准确哟)产生识别,而识别的方法是由设计者确定的,在逻辑层完成.不一定是帧首方式,识别类型较多,一个CPU内的电路层识别结构就可能有十几种,逻辑层识别模式也最少有多个.

嘿嘿!不知道有没有错字!
啪!
还是先吃个什么
Gujianda 2004-11-22
  • 打赏
  • 举报
回复
首先不明确你指的"操作码"是一条指令中的操作码部分还是指整个一条指令、还是泛指程序序列。

1,如果是指是一条指令,那么设计和编排操作码时就要考虑这点,即 CPU 读入指令的第一字节后就要能明确:
指令还有没有第二个字节,如果有则中间三个Bit是REG?还是操作码的补充位?
操作码(1或2个字节)全部读入后就要让 CPU 明确后面有几个操作数、每个操作数是几个字节?
如此就能保证完整读入一条指令的操作码部分和操作数部分。还是那句话:“相信”Intel...

2,如果是泛指程序序列,那么我觉得正如你所言,CPU 根本不知道哪里是代码的结束,事实上内存里的程序首先是操作系统的程序,它可是是无穷循环往的,对某个程序来说即使退出了,也只不过是退到了操作系统(OS)而已,CPU 可没有停下!

3,也许您刚接触汇编,那么这里再罗所一句:源程序里的"END"仅仅是告诉编译器:"我的代码写完了"而已。一个程序的代码,如果在完成任务后,没有执行"退到操作系统"的指令,那么 CPU 就会继续读入这段代码后面的东西,并继续把它门"理解"成指令代码来执行,这显然就会出"笑话"!
ovmem 2004-11-22
  • 打赏
  • 举报
回复
…………用 hlt 结束,对应十六进制0F4
看来你对原理是一点都不了解,建议你还是自己先看书,不明再问,你在想这里想找捷径是不行的,这种学习方法效率很低
Gujianda 2004-11-21
  • 打赏
  • 举报
回复
正如楼上所比喻的,只要是一段正确的代码,放入内存后,从"第一个"字节(由操作系统定位)读起肯定是指令,只要读到了指令,后面的内容是另一条指令还是本指令的操作数就不言而喻了。
至于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 的工程师吧。
ovmem 2004-11-21
  • 打赏
  • 举报
回复
to 楼主:

看我的这段话你懂我说什么吗如果不懂你可能就是有智力问题了cpu读指令也和你现在差不多你也不妨把我的话连成一个环然后再在其中某个字开始读直到读完所有的字看一下你还能读懂什么其实cpu也经常会出现这样的错误
avalonBBS 2004-11-20
  • 打赏
  • 举报
回复
做个记号先 : )
Areslee 2004-11-18
  • 打赏
  • 举报
回复
偶目前正在看这方面的问题^_^
看能不能做个有意思点的DEBUG出来玩玩
目前在写脚本处理器中,麻烦:(
Ruluo 2004-11-18
  • 打赏
  • 举报
回复
不同的指令有不同的编码方式
指令编码的方式确定了指令的长度
机器取指令时根据指令名称取不同的长度(字节)不就OK了

指令首尾相接不假
但指令长度都是字节的整数倍
是以字节为单位首尾相接,不是以“1”、“0”相接
也就是不会出现两个指令共占一个字节的一部分这种情况
所以不难识别

程序执行期间
取指周期取出的是指令、其他是数据
也就是以访存时间的不同(取指周期和非取指周期)来区分指令和数据的

不知说的对不?
还是要好好看看《组成原理》
……
Areslee 2004-11-18
  • 打赏
  • 举报
回复
没啥,构想中
W32API 2004-11-18
  • 打赏
  • 举报
回复
看来这家伙是闲得发慌了。。。
meng007 2004-11-18
  • 打赏
  • 举报
回复
to meng007()
没讲怎么明白?你讲讲看。

我的意思是说,如果要把这个问题给你彻底解释清楚,就快写一本微机原理书了,所以你不如找本微机原理好好看看,国内的书就算了,看看编码的奥秘之类的,还有我曾经推荐过的
http://community.csdn.net/Expert/topic/3466/3466150.xml?temp=.9184992
W32API 2004-11-18
  • 打赏
  • 举报
回复
二楼的,有意思的 DEBUG ? 说说
red-fly 2004-11-18
  • 打赏
  • 举报
回复
记住这一贴了先
hswxf 2004-11-17
  • 打赏
  • 举报
回复
制学要严谨:)

好象俺们老头呀!嘿嘿!

不过太认真了就不好玩了,当然,你还是对的!呵呵!
加载更多回复(24)

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧