计算机把cs:ip指向的地址当作代码执行 执行一句指令 然后根据指令长度累加ip指令 使之指向下一条指令 请问他是怎么获取指令长度的?
------解决方案--------------------------------------------------------
在第一步取指的时候,就可以获取指令长度啦。
------解决方案--------------------------------------------------------
由于X86指令的长度不是固定的,通常是1~15个字节。获取指令长度应该是在译码阶段吧,指令从内存读入到cache中,开始预解码,得出预译码标识。预译码标识就包括了指令的起始地址和结束为止,从而获取指令长度。然后再做解码位uop等等操作。 我想这跟处理器有太多关系。
------解决方案--------------------------------------------------------
JMP EB cb rel8 Jump short, relative, displacement relative to next instruction
JMP E9 cw rel16 Jump near, relative, displacement relative to next instruction
JMP E9 cd rel32 Jump near, relative, displacement relative to next instruction
JMP FF /4 r/m16 Jump near, absolute indirect, address given in r/m16
JMP FF /4 r/m32 Jump near, absolute indirect, address given in r/m32
JMP EA cd ptr16:16 Jump far, absolute, address given in operand
JMP EA cp ptr16:32 Jump far, absolute, address given in operand
JMP FF /5 m16:16 Jump far, absolute indirect, address given in m16:16
JMP FF /5 m16:32 Jump far, absolute indirect, address given in m16:32
举例吧,好像程序遇到 E9 就是 JMP
但是是 E9 cw 还是 E9 cd 呢?
就看后面是 word 还是 dword (怎么看? 看后面有没有控制指令呗。。。)
分析出来之后是不是就知道指令的长度了。。。
------解决方案--------------------------------------------------------
#5楼 的例子不妥。E9 cw 还是 E9 cd ,这个可不是由后面的控制什么来的,E9 后面没有其它内容了,就只是跳转偏移。究竟是 16 位还是 32 位,是看执行环境的,即当前程序段类型的,简单地说,dos16 类的程序里就是 16 位,Win32 类的程序里就是 32 位的。