ZyOrca

导航

JMP 改变 EIP 的原理

CPU执行一条指令的过程:

1. 取指令——把程序计数器(PC)所存的指令地址装入地址寄存器(AR),地址寄存器通过地址总线找到指令地址对应的主存单元,取出指令;然后通过数据总线将指令传给CPU的指令寄存器(IR);当一条指令被取出后,PC中的数值将根据指令字长度而自动递增;

2. 指令译码——指令寄存器(IR)将指令发送给指令译码器,进行译码;指令译码器首先分析这条指令的操作码是什么,以决定操作的性质和方法(算术操作、逻辑操作、数据传输、条件分支操作),然后才能控制计算机其他各部件协同完成指令表达的功能;

3. 计算操作数地址——确定本条指令操作数的地址,共有立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址等七种寻址方式

4. 取操作数——将指令中的有效地址(EA)输出到地址总线,地址总线从存储单元读出数据,然后将读出的数据通过数据总线送到CPU的暂存寄存器(TR)中;如果操作数在寄存器中,此阶段可以跳过;

5. 执行指令——完成指令所规定的各种操作,具体实现指令的功能;例如,如果要求完成一个加法运算,算术逻辑单元ALU将被连接到一组输入和一组输出,输入端提供需要相加的数值,输出端将含有最后的运算结果;

6. 数据写回:CPU 将计算结果存回寄存器或者将寄存器的值存入内存,这个部分称为 Store。

 

但无条件跳转指令jmp的指令周期比较简单:

1. 例如指令 000015H:jmp 11H,CPU把位于内存地址000015h指令“jmp 11H”取出送到指令寄存器(IR),同时程序计数器PC内容加1,变为 000016H;指令译码后知道指令寄存器(IR)中的指令是无条件转移指令;

2. CPU把指令寄存器(IR)中地址码部分0011H送到程序计数器,从而用新内容0011H代替PC原先的内容0016H。这样,下一条指令将不从0016H单元读出,而是从内存0011H单元开始读出并执行,从而改变了程序原先的执行顺序。

 

总的来说,一条无条件跳转指令JMP的指令周期内,PC的值被修改了2次。取指周期结束后,PC值自动加1;执行周期中,PC值修改为要跳转的地址。

posted on 2022-02-07 19:04  ZyOrca  阅读(221)  评论(0编辑  收藏  举报