CPU怎样读取指令
发布网友
发布时间:2022-04-24 04:22
我来回答
共2个回答
热心网友
时间:2023-10-27 15:09
指令都有固定格式,一般先读第一个字节判断是否是前缀,然后读第2字节并查表看是否是机器码,若不是则读第3个字节查表,找到指令后继续读ModR/M、SIB等参数确定后面还有几个操作数。如读取指令mov
eax,dword
ptr
ss:[ebx
ecx*4]先读第一个字节,查表得到前缀SS,读第2字节,发现是mov
r,r/m,于是读第3字节(ModR/M)得到r=eax,r/m=disp32[--],因此需要读第4字节(SIB),得到r/m=[ebx
ecx*4]具体可以看Intel
Architecture
Software
Developer’s
Manual
Volume??2:
Instruction
Set
Reference
热心网友
时间:2023-10-27 15:09
因为2000:0003处的指令
mov
bx,0003h的指令代码占3个字节,所以,读取完该指令后,指令缓冲器的内容为该指令机器代码:bb
03
00。当然,读取得这3个字节的指令并不是一次访存完成的,至少要通过两次访存,第一次读取字节bb,第二次读取16字03
00。
cpu读取指令时,如果单字节指令,一次访存即可完成读取操作;如果是多字节指令,会根据第一次读取指令的操作码与寻址标志位,判断指令的后续长度,进而完成整个指令的读取,同时指令指针ip会自动进行修改,指向下一条待取指令。
热心网友
时间:2023-10-27 15:09
指令都有固定格式,一般先读第一个字节判断是否是前缀,然后读第2字节并查表看是否是机器码,若不是则读第3个字节查表,找到指令后继续读ModR/M、SIB等参数确定后面还有几个操作数。如读取指令mov
eax,dword
ptr
ss:[ebx
ecx*4]先读第一个字节,查表得到前缀SS,读第2字节,发现是mov
r,r/m,于是读第3字节(ModR/M)得到r=eax,r/m=disp32[--],因此需要读第4字节(SIB),得到r/m=[ebx
ecx*4]具体可以看Intel
Architecture
Software
Developer’s
Manual
Volume??2:
Instruction
Set
Reference
热心网友
时间:2023-10-27 15:09
因为2000:0003处的指令
mov
bx,0003h的指令代码占3个字节,所以,读取完该指令后,指令缓冲器的内容为该指令机器代码:bb
03
00。当然,读取得这3个字节的指令并不是一次访存完成的,至少要通过两次访存,第一次读取字节bb,第二次读取16字03
00。
cpu读取指令时,如果单字节指令,一次访存即可完成读取操作;如果是多字节指令,会根据第一次读取指令的操作码与寻址标志位,判断指令的后续长度,进而完成整个指令的读取,同时指令指针ip会自动进行修改,指向下一条待取指令。