|
主题 : : cpu怎么知道指令字长? [待解决] |
回复[ 7次 ]
点击[ 771次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-02-18 12:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-02-18 12:02 |
mov ax,01的机器码是3个字节,执行此语句后,ip自动加3,我想问cpu怎么知道到内存取3个字节而不是2个或者别的? | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-02-18 13:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2007-11-26 20:27 |
MOV AX,XX这样的指令经过编译器汇编成机器码后,第一个字节码应该会告诉CPU,这个指令有多长
我猜的,呵呵 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-02-20 16:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-02-20 12:46 |
问题是:
程序读入内存后,理论上应该是一片连续存放的诸如 XX XX XX 的数据 ,CPU是如何识别出哪个字节是指令,哪个字节又是数据的呢?
用debug往内存胡乱写几十个字符,然后再 U 一下这段“代码”,就知道为什么我们会疑惑了。。。。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-02-21 00:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-02-21 00:17 |
这个编码是有规定的,基本道理就是以什么样的开头就能推算出有多长
starrynight的学习博客,拨开【汇编迷雾(一)】相同的汇编指令VS不同的机器代码 ,里图说明了问题 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-02-27 10:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
这个是不是说,cpu读取指令的时候,需要先读取第一个字节,然后分析需要后续再读几个字节然后再实现ip增加啊。这样好像不太合理啊? | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-02-27 14:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:45
信誉值:0
注册日期:2007-05-05 09:01 |
这个问题的解释,可以在 组成原理 中找到答案!
cup 读取 cs:ip 指向的一条指令,通过指令译码器,将一条指令翻译为 微指令
然后由 微程序控制器 控制并执行此指令的微程序(一条条的微指令),其中有一条微指令
去修改PC(即程序计数器,保存着下一条指令的地址)。
所以CPU 通过 控制器中的指令译码器和微程序控制器来识别一条指令的长度,和修改指向下一条指令的地址。
具体的可以找一本 组成原理 细细查看~!
------------------
注:以上只针对含微程序的cup来说 | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-03-18 09:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:32
信誉值:0
注册日期:2008-01-15 12:22 |
反正cpu自动读取下一条指令,在这之间我们也插不上手,怎么记下,有兴趣可以研究一下,继续向下学习了~ | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-03-18 10:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2007-08-22 13:44 |
楼主这个问题问得很好啊。
不过这是属于指令编码学的知识,也是汇编最难的内容之一,我们可以很容易在intel cpu程序员手册里查到楼主的答案 | | |