第三章 保护模式 pmtest2.asm添加实现段间间接远转移代码
一、Intel 段间间接远跳转
格式: jmp dword ptr orp执行的操作:
( IP ) < --- ( EA )
( CS ) <---- ( EA + 2 )
对于386及其后继机型:
( EIP ) <------ ( EA )
( CS ) <------- ( EA + 4)
其中EA为内存地址,
二、动手操作
1.在[SECTION .data1]中添加两个变量来存放跳转目标处的段基址和偏移
即为CSValueInRealMode和IPValueInRealMode,注意前者即CS为dw,IP为dd
还有保证在DateLen标号之前,曾今我把这两个变量放到DataLen之后,编译时间很长,而且生成的目标文件达到1.5G之多,肯定无法运行了,惨痛的教训啊!谨记
LABEL_GO_BACK_TO_REAL: ;jmp 0:LABEL_REAL_ENTRY mov ax, bx mov ds, ax mov [IPValueInRealMode], dword LABEL_REAL_ENTRY jmp dword far [IPValueInRealMode]
三、小结
很显然,我这个方法没有作者的简单。但从这个小尝试我学到了很多,细节啊,太重要了啊!
此外,还发现一个奇怪的现象,如果没有保存edx的值前对它进行了赋值操作,结果是我们最后可以返回dos出现问题,没有提示符,而且我想显示的一段字符串也没有显示,调试发现在程序运行之前edx的值是0x40000,而且在正常成功返回dos时也是这个值,于是,我尝试在修改edx之后,在给它赋值0x40000,果不出我所料,成功返回到dos,一切正常,这个0x40000大概存放着特定的东东吧。