汇编-在保护模式的无特权级变换的转移

问题描述

在保护模式的无特权级变换的转移
在保护模式下采用 JMP 和 RETF 指令进行任务内无特权级变换的转移.最好是能给出程序和说明,而不是到处引用,新手勿扰。

解决方案

用 JUMP、CALL、RETF等指令进行相应段的转移。在用到 CALL 指令时,使用堆栈,以使得在调用 CALL时,系统对 CALL 当前的程序运行点进行压栈保存,在遇到 RETF 返回指令时,进行弹栈返回。

解决方案二:
(1)实模式下的初始化,包括对GDT和演示任务LDT的初始化,装载GDTR;
(2)从实模式切换到保护模式,处于0特权级;
(3)装载LDTR,并设置堆栈;
(4)利用段间转移指令JMP实现从代码段K到同级代码段L的转移;
(5)利用段间调用指令CALL调用同级代码段C中的子程序D显示字符串信息;
(6)利用段间调用指令CALL调用同级代码段C中的子程序H把十六进制数转换成对应的ASCII码;
(7)再利用段间调用指令CALL调用同级代码段C中的子程序D显示字符串信息;
(8)利用段间转移指令JMP实现从代码段L到代码段K的转移;
(9)从保护模式切换到实模式;
(10)在实模式下结束程序。
该实例的逻辑功能是用十六进制数的形式显示代码段L的段界限的值。源程序如下:
;名称:ASM3.ASM
;功能:演示任务内无特权级变换的转移
;编译:TASM ASM3.ASM
;连接:TLINK ASM3.OBJ

INCLUDE 386SCD.INC

GDTSeg SEGMENT PARA USE16 'GDT' ;全局描述符表数据段(16位)

GDT LABEL BYTE ;全局描述符表
DUMMY Desc <> ;空描述符
Normal Desc ;规范段描述符
CodeK Desc ;代码段K的描述符
LDTable Desc ;局部描述符表段的描述符

GDTLen = $-GDT ;全局描述符表长度

Normal_Sel = Normal-GDT ;规范段描述符选择子
CodeK_Sel = CodeK-GDT ;代码段K的选择子
LDT_Sel = LDTable-GDT ;局部描述符表段的选择子

GDTSeg ENDS ;全局描述符表段定义结束

LDTSeg SEGMENT PARA USE16 'LDT' ;局部描述符表数据段(16位)
LDT LABEL BYTE ;局部描述符表
;代码段L的描述符
CodeL Desc
;代码段C的描述符
CodeC Desc
;显示缓冲区段描述符
VideoBuf Desc
;LDT别名段描述符(DPL=3)
ToLDT Desc
;显示信息缓冲区数据段描述符(DPL=3)
MData Desc
;堆栈段描述符
StackS Desc

LDTLen

解决方案三:
保护模式编程——保护的详尽意义:通过调用门转移特权级
http://www.zdh1909.com/html/Verilog/29918.html

解决方案四:
希望对你有帮助:http://blog.sina.com.cn/s/blog_6b140d210100k2rw.html

时间: 2024-10-05 16:31:55

汇编-在保护模式的无特权级变换的转移的相关文章

保护模式汇编系列之一 - 初探保护模式

为了后面学习操作系统的需要,从今天开始我要研究x86的汇编了.所以我决定开始总结并连载x86的汇编系列,这是第一篇--初探保护模式. 我假定读者接触过16位的汇编语言,并理解汇编语言的基本概念.熟悉8086处理器采用的"段寄存器 * 16 + 偏移地址"的寻址方法. 我们从80386处理器入手.首先,到了80386时代,CPU有了三种运行模式,即实模式.保护模式和虚拟8086模式. 实模式指的是8086CPU的运行模式,不过这是后来提出的概念,在8086时代只有当时的运行模式,自然也就

保护模式汇编系列之二 - 中断和异常处理

如果你对中断是什么都不清楚的话,还是先Google一下中断的定义和基本概念吧,这里给出一个链接: http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7 好了,看完了这个链接,我想你已经大致明白了什么是中断,还有中断的作用了吧?我们再来总结下,其实简单说中断就是一种通知机制罢了.我们知道操作系统的一个核心任务就是和连接在主板上的所有的硬件设备进行通信,但是CPU和这些外设的速率根本就不在一个数量级上,倘若CPU向某一个设备发出一个请求并且一直等待反馈结果的话,

深入理解计算机系统-之-内存寻址(二)--存储保护机制(CPU实模式与保护模式)

cpu的保护模式由来 分段机制 8086的诞生,标志着Intel 正式进入了x86时代,这是个多么具有纪念意义的日子:1978-6-8.同时,8086的诞生也是处理器内存寻址技术的第一次飞跃. 对于一根实际的.实实在在的.物理的.可看得见.摸得着的内存条而言,处理器把它当做8位一个字节的序列来管理和存取,每一个内存字节都有一个对应的地址,我们叫它物理地址,用地址可以表示的长度叫做寻址空间.而CPU是如何去访问内存单元里的数据的方式就叫做寻址. 8086得CPU在内存寻址方面第一次引入了一个非常重

实模式/保护模式,GDT/LDT的含义

1.实模式.保护模式CPU启动时有两种模式,分别是:实模式 和 保护模式 实模式:不能使用多线程.不能实现权限分级.还不能访问20位以上地址线,也就是说只能访问1M内存(!!!)地址转换公式是:物理地址 = 线性地址 = 段地址*16 + 段偏移 保护模式:操作系统(system模块中的head.s程序)接管CPU后,会使CPU进入保护模式. 包括CPU权限分级. 多任务,内存分页等各种功能. 2.地址转换步骤 地址转换:查全GDT--> 查LDT --> 找到段(确定段基址) -->

Linux操作系统基础(四)保护模式内存管理(2)【转】

转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blog.csdn.net/rosetta           本节主要讲:保护模式内存管理相关的物理地址空间,逻辑和线性地址空间,段选择符,段寄存器,段描述符. 物理地址空间          保护模式下,IA-32架构提供了一个4GBytes(2^32bytes)正常大小的物理寻址空间.处理器可以使用

嵌入式实时应用开发实战(原书第3版)》——3.3 保护模式架构

3.3 保护模式架构 在现代的Intel处理器中,实现保护模式存储器首先出现在80386中.它采用一个整32bit的地址对4GB的范围寻址.访问是受控的,因此一个存储块可能执行只读或读/写操作. 处理器可以工作在4个优先级中的一个,一个运行在最高优先级(0级)的程序可以做任何事情--执行I/O指令.启用或屏蔽中断.改变描述符表.低优先级会阻止程序执行可能有危险的操作.例如,一个字处理应用程序不能被中断标志干扰,因为前者是操作系统的工作. 所以操作系统运行在最高优先级,而应用程序代码通常运行在最低

如何实现Oracle DG最大保护模式

实现最大保护模式,可以先实现最大性能模式,然后再转换为最大保护模式. 一.三种保护模式 最大性能(maximize performance):这是data guard默认的保护模式.primay上的事务commit前不需要从standby上收到反馈信息,该模式在primary故障时可能丢失数据,但standby对primary的性能影响最小. 最大可用(maximize availability):在正常情况下,最大可用模式和最大保护模式一样:在standby不可用时,最大可用模式会自动降低成最

Oracle Data Guard的三种保护模式

Data Guard提供如下三种数据保护模式: 1)最高保护模式(Maximum Protection) 这里的"最大保护"是指最大限度的保护数据不丢失,也就是至少有一个standby和primary保持实时同步,但这样做的代价很大,即当一个事务提交时,不但要写到primary段的online redo log,还有写到至少一个standby的standby redo log.这样会有一个严重的问题,就是当standby出现故障或网络故障,导致日志无法同步时,primary数据库会被s

Oracle Data Guard学习(1) 三种保护模式

Data Guard提供如下三种数据保护模式: 1)最高保护模式(Maximum Protection) 这里的"最高保护"是指最大限度的保护数据不丢失,也就是至少有一个standby和 primary保持实时同步,但这样做的代价很大,因为只要当一个事务提交时,不但要写到primary段的 online redo log,还有写到至少一个standby的standby redo log.这样会有一个严重的问题,就是当 standby出现故障或网络故障,导致日志无法同步时,primary