首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

第三章 保护模式 pmtest2.asm平添实现段间间接远转移代码

2012-08-16 
第三章 保护模式pmtest2.asm添加实现段间间接远转移代码一、Intel 段间间接远跳转式: jmpdword ptr orp执行

第三章 保护模式 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大概存放着特定的东东吧。


热点排行