●●●一个IP寄存器如何知道下一条指令长度的问题!请各位指教●●●

1423567 2005-09-05 11:07:23
在8088/8086的CPU逻辑结构中
我们都知道每当一条指令执行以后IP寄存器的值会自动指向下一条指令的首地址,然后CPU的BIU部件就会去刚内存地址去读指令,我的问题也就在这里,他只知下一条指令始地址,并不知道下一条指令有多长有多少个字节。程序加载到内存中后指令也都是以2进制保存的,每条指令长度也都是不一样的
CPU怎么知道下一条指令的长度是多少?

感谢各位大侠的赐教!谢谢!解决马上给分!大家多给说说~
...全文
393 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2005-09-07
  • 打赏
  • 举报
回复
你可以参考 计算机体系结构 指令的编码 一章。
1423567 2005-09-06
  • 打赏
  • 举报
回复
谢谢楼上的回复!据我知道的指令列队也就是你上面说的(缓冲区)8086是里是有6个字节
8088有4个字节,这是我所知道的。
那问题就在这里 我们都知道每条指令的机器码长度都是不同的有的可能2个字节也可能3个字节 然后我们再看8086的结构每次读入6个字节到缓冲区里 这跟我前面说的每条指令长度不符合了
CPU又怎么辨别呢?
我看了8086的逻辑结构图上 指令列队的下一个处理器件就是EU 会不会在这里做了什么?
请各位指教!
谢谢!
zara 2005-09-06
  • 打赏
  • 举报
回复
cpu 不是读入下一条指令的完整的长度的, 而是它有个指令缓冲池, 大小是固定的, 即一次读入的长度是一定的, 缓冲池空了的时候就再次读入. 当前指令的长度是由解码器部分来确定完成的, 除了转移类的指令外, 后续的被认为是下一条指令; 如果是转移类指令, 包括 jmp/j??/call 之类的, 指令缓冲池会被清空, 再次读入新的目标处的指令
1423567 2005-09-06
  • 打赏
  • 举报
回复
也先谢谢楼上的回复,我明白了一点 你的意思就是说 “ 知道了操作码,就可以确定当前指令的长度” 我想知道一下处理这个部件是否是EU呢? 希望各位有啥就补充点。没问题了我就想结帖了!
我的QQ:346749130 希望大家多多探讨
liangbch 2005-09-06
  • 打赏
  • 举报
回复 1
所有的x86指令的第一个字节都是操作码(有的第二个字节也是操作码),操作码包含了3部分信息,1.作什么操作,2。操作数(或寄存器)是什么。3.操作数(或者寄存器)的宽度是多少,字节,字还是双字。知道了操作码,就可以确定当前指令的长度,进而可以确定下一条指令的地址:
注意,在汇编语言中,相同的指令其操作码并不一定相同,如 指令 mov ax,[si+4], mov ax,[si+1234] 粗看出来,功能,寄存器都是一样。但操作码并不相同,它们的操作码分别是,8B44 和8B84,下面是在debug下反汇编的结果。


138E:0100 8B4404 MOV AX,[SI+04]
138E:0103 8B843412 MOV AX,[SI+1234]

21,458

社区成员

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

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