先说在前面,由于编译器的影响,将我的jmp far segement:offset 语句错误的翻译成了jmp dword ptr [offset],导致我光是排错就思考了2小时。这个大坑点后面的人一定不要再踩上去
上网查阅资料,果然,jmp far 这种被认为是16位时期的指令,不过我也是第一次知道原来万能的编译器也会乱翻译(笑
正确的我的能够运行的代码如下
#include "stdafx.h"
#include<Windows.h>
void __declspec(naked) test(){
__asm{
ret;
}
}
int _tmain(int argc,_TCHAR* argv[]){
printf("%x\r\n",test());
char bufcode[6] = {0,0,0,0,0x48,0};
*(int *)&bufcode[0] = (int)test;
printf("bufcode: %02X %02X %02X %02X %02X %02X\n",
(ungigned char)bufcode[0],
(ungigned char)bufcode[1]
(ungigned char)bufcode[2]
(ungigned char)bufcode[3]
(ungigned char)bufcode[4]
(ungigned char)bufcode[5]);
__asm{
jmp fword ptr bufcode;//
}
}
赘述不多说,运行到跳转的这一步,此时cs的值是1b
然后继续向下运行,此时CS被改了
但是随着我们继续运行,CS又被改了回来
综上所述,CPL == DPL,和RPL无关,CPU会有处理机制自动帮助我们纠错