第三章 保护模式 pmtest2.asm添加实现段间间接远转移代码
来源:互联网 发布:asp连接access数据库 编辑:程序博客网 时间:2024/06/03 17:31
一、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之多,肯定无法运行了,惨痛的教训啊!谨记
[SECTION .data1]ALIGN 32[BITS 32]LABEL_DATA:SPValueInRealMode dw 0PMMessage db "In Protected Mode now. ^-^", 0OffsetPMMessage equ PMMessage - $$StrTest db "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0OffsetStrTest equ StrTest - $$IPValueInRealMode dd 0CSValueInRealMode dw 0DataLen equ $ - LABEL_DATA; END OF [SECTION .data1]=====================================
2.在[SECTION .s16]中为CSValueInRealMode赋值,因为我们实在不同的段间跳转,而且这两个对象不仅代码段不同,数据段,堆栈段都不同,所以我们还要通过寄存器把DS值传到[SECTION .s16code]中,这里先把ds的值压栈中
mov ax, cs mov ds, ax mov es, ax mov ss, ax mov sp, 0100h mov [CSValueInRealMode], ax push ax ;mov [LABEL_GO_BACK_TO_REAL + 3], ax mov [SPValueInRealMode], sp
3.在跳转到保护模式之前弹出堆栈内容到ax
; switch into Protected Mode pop ax jmp dword SelectorCode32:04.在保护模式中临时保存ds的值到
[SECTION .scode32][BITS 32]LABEL_SEG_CODE32: mov bx, ax mov ax, SelectorData mov ds, ax mov ax, SelectorTest mov es, ax mov ax, SelectorVideo mov gs, ax mov ax, SelectorStack mov ss, ax mov esp, TopOfStack
5.关键时刻,来到了[SECTION .scode16]
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大概存放着特定的东东吧。
- 第三章 保护模式 pmtest2.asm添加实现段间间接远转移代码
- pmtest2.asm 保护模式2
- 第三章pmtest2源码解析 实模式到保护模式再到实模式
- pmtest2.asm
- (第三章 8 )特权级——保护模式的特权级检查(DPL,RPL,CPL, 一致代码段,非一致代码段)
- 保护模式第三章
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-无特权级转换)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-理论)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-进入ring3)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-进入ring3-b)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-实践篇)
- 代码段间转移控制时的特权级检查(JMP/CALL)——《x86汇编语言:从实模式到保护模式》读书笔记28
- 一个操作系统的实现:第三章 保护模式 调试问题
- 《一个操作系统的实现》读书笔记--第三章--保护模式
- 《自己动手写操作系统》第三章pmtest2源码解析
- 3.保护模式7-特权级转移(通过调用门转移目标段-无特权级转换)
- 3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-理论)
- 3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-进入ring3)
- VC工具优化
- 算法--兔子生兔子的问题(费氏数列)
- SQlite Android数据库的应用 Android SQLite 简易的学生成绩管理系统
- 一种使用Microsoft ActiveSync 4.5进行WINCE的同步时避免电脑死机的方法
- C语言开发之运算符、表达式用法
- 第三章 保护模式 pmtest2.asm添加实现段间间接远转移代码
- 求S字符串中最长重复子串
- Android入门:广播发送者与广播接收者
- POJ1986-LCA问题的在线离线两种算法
- tq2440+ubuntu安装qt4.5
- Access分页方案
- oracle连接查询详解
- 打篮球去
- C关键字解读——sizeof, 循环判断语句