首页
社区
课程
招聘
[旧帖] [讨论]CPU取指算法 0.00雪花
发表于: 2014-7-16 15:04 6957

[旧帖] [讨论]CPU取指算法 0.00雪花

2014-7-16 15:04
6957
现在很多计算机组成原理书、体系结构书上对CPU取指环节就一句话带过:CPU在取指阶段,根据PC指示的地址取指令,然后PC指向下一条指令地址。
但是,我在想,虽然CPU知道是取指令,但是指令在内存中也就是二进制数据,那么CPU是如何来判断本次取指需要取多少字节的指令数据呢?
下面是我的猜想,求拍砖指导:
      首先,CPU在取指阶段并不知道具体取多长字节的指令,所以根据指令的最大长度~15字节。CPU在一次取指阶段,直接从内存中预取15字节的指令数据。然后对该15字节的指令数据进行长度识别。
不知道上述猜测是否正确?
另外,谁知道指令寄存器(IR)的位数?
求指导,或者说说你们的理解,以及依据。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
2
这个是不可能的。。。
具体的,你随便下个开源的反汇编器,看下就知道了,嫌麻烦也可直接看intel的开发手册。
我对取指令也不是很了解,只记得好像是可以从第一个字节推算出来的。
2014-7-16 16:08
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我没用过开源的反汇编器,求介绍一个好用的。谢谢!
我用INTEL开发的动态插装工具PIN调试过,该工具中模拟CPU取指的函数就是一次从内存中取15字节的数据。
另外,intel软件开发手册我也看了,包括指令的格式、opcode的映射表。并根据手册上的介绍,用C写了个识别一段指令数据的长度的程序。应该从第一个字节不能判断指令的长度,因为根据指令的格式,其第一个字节可能是前缀,也可能是opcode,并且整个指令的长度还与 modR\M相关。
2014-7-16 16:37
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我没用过开源的反汇编器,求介绍一个好用的。谢谢!
我用INTEL开发的动态插装工具PIN调试过,该工具中模拟CPU取指的函数就是一次从内存中取15字节的数据。
另外,intel软件开发手册我也看了,包括指令的格式、opcode的映射表。并根据手册上的介绍,用C写了个识别一段指令数据的长度的程序。应该从第一个字节不能判断指令的长度,因为根据指令的格式,其第一个字节可能是前缀,也可能是opcode,并且整个指令的长度还与 modR\M相关。
2014-7-16 16:39
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
udis86、BeaEngine、Capstone Engine。
2014-7-16 16:45
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
lz的疑问就是cisc体系的软肋
2014-7-16 19:45
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有木有相关文档说明?
2014-7-17 15:06
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
说实在话,这个问题也困扰了我很久,到现在也没有找到确切的答案。迫切期望大虾解惑。
2014-7-17 15:29
0
雪    币: 123
活跃值: (144)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
http://bbs.pediy.com/showthread.php?t=183180

我这个设计里面有两种指令,一种是16位的,一种是32位的,译码器根据第一个16位判断进入哪个状态(是FETCH2还是EXEC),然后再执行,CISC的指令集才有这种问题,如果是个RISC,则不存在这个问题,流水线也相对容易设计
2014-7-17 18:31
0
雪    币: 123
活跃值: (144)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
还有就是:
另外,谁知道指令寄存器(IR)的位数?
这个要看是什么设计,如果是RISC的结构 一般教科书上的那种都是32位,而CISC就麻烦了
CISC的话,需要使用CPU里面的微指令配合解码 IR就复杂了
2014-7-17 18:35
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我问的是关于CISC的。。。确实比较复杂。
RISC指令等长,不存在这些问题。
2014-7-17 22:30
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
如果因为不知道每个指令的字节长度,而直接取15字节来对比是不可能的,至少从逻辑上分析是不会的。
2014-7-18 08:18
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
帖子居然被移到初学者园地板块。。。无语!
2014-7-18 12:33
0
雪    币: 4
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
CPU是分精简指令集和复杂指令集的。
我对6502 CPU(8位)有些研究(我用C++进行了模拟),这个CPU比较早了,当时好像没有精简和复杂指令集的概念(或者很模糊)。
它的寻址方式很多,这符合复杂指令集的特点,但是它有典型的Load/Store结构,所以我把它归为精简指令集。
这个CPU的操作码只占一个字节,执行指令的过程如下。
1. 根据PC获取到操作码,操作码包含了寻址方式信息和将要进行的运算信息(算术运算、逻辑运算等等);
2. 根据寻址方式信息获取到操作数;
3. 根据将要运算的信息对操作数进行运算;
4. PC根据寻址方式进行增加(或减少,如果是“相对寻址”方式,则PC可能往回跳)。

对于复杂指令集的CPU我也是新手,只是局限于书中所说(书中基本都是基于80x86进行讲解)。
如果你真的希望知道细节,可以参考对应CPU的官方文档信息,使用自己熟悉的语言模拟一下。
希望能够帮到你。
2014-7-22 10:16
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我记得我学的组原说指令分为定长指令和变长指令,我们知道指令由:操作码+操作数地址组成的,操作码又分为定长操作码和变长操作码,一般定长指令用的是变长操作码(或者叫扩展操作码),变长指令要灵活些,但是变长的话就不知道到底该取几字节,所以操作码采用定长的,取指令的后分析操作码就知道到底取几字节了。 不知道记得对不对.....
2014-7-22 11:49
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
同学,建议你还是不要看神马计算机组成原理。。。里面介绍的太浅显了,一般都在汇编层次上讲解指令。
当你阅读了intel或者amd的官方文档了,你会发现,根本不是那回事儿!
2014-7-22 14:36
0
雪    币: 484
活跃值: (977)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
对于intel这种变长汇编指令 先取第一个字节 然后可以计算出整条指令的长度 比如长跳转jmp 机器码是e9 然后就可以知道整条指令是5个字节 然后就OK了
2014-7-25 16:24
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
指令的格式为  prefix+opcode+modR/M+SIB+displacement+immediate。所以,单从第一字节无法判断整条指令的长度。
2014-7-25 19:46
0
游客
登录 | 注册 方可回帖
返回
//