代码段数据段的划分-对于代码段的影响

先说在前面,由于编译器的影响,将我的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会有处理机制自动帮助我们纠错

上一篇:十五届蓝桥杯赛题-c/c++ 大学b组-R格式


下一篇:YouQu使用手册【元素定位】