; ==========================================
; pmtest3.asm
; 编译方法:nasm pmtest3.asm -o pmtest3.com
; ========================================== %include "pm.inc" ; 常量, 宏, 以及一些说明 org 0100h
jmp LABEL_BEGIN [SECTION .gdt]
; GDT
; 段基址, 段界限 , 属性
LABEL_GDT: Descriptor , , ; 空描述符
LABEL_DESC_NORMAL: Descriptor , 0ffffh, DA_DRW ; Normal 描述符
LABEL_DESC_CODE32: Descriptor , SegCode32Len - , DA_C + DA_32 ; 非一致代码段, 32
LABEL_DESC_CODE16: Descriptor , 0ffffh, DA_C ; 非一致代码段, 16
LABEL_DESC_DATA: Descriptor , DataLen - , DA_DRW+DA_DPL1 ; Data
LABEL_DESC_STACK: Descriptor , TopOfStack, DA_DRWA + DA_32; Stack, 32 位
LABEL_DESC_LDT: Descriptor , LDTLen - , DA_LDT ; LDT
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
; GDT 结束 GdtLen equ $ - LABEL_GDT ; GDT长度
GdtPtr dw GdtLen - ; GDT界限
dd ; GDT基地址 ; GDT 选择子
SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT
SelectorData equ LABEL_DESC_DATA - LABEL_GDT
SelectorStack equ LABEL_DESC_STACK - LABEL_GDT
SelectorLDT equ LABEL_DESC_LDT - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
; END of [SECTION .gdt] [SECTION .data1] ; 数据段
ALIGN
[BITS ]
LABEL_DATA:
SPValueInRealMode dw
; 字符串
PMMessage: db "In Protect Mode now. ^-^", ; 进入保护模式后显示此字符串
OffsetPMMessage equ PMMessage - $$
StrTest: db "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
OffsetStrTest equ StrTest - $$
DataLen equ $ - LABEL_DATA
; END of [SECTION .data1] ; 全局堆栈段
[SECTION .gs]
ALIGN
[BITS ]
LABEL_STACK:
times db TopOfStack equ $ - LABEL_STACK - ; END of [SECTION .gs] [SECTION .s16]
[BITS ]
LABEL_BEGIN:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0100h mov [LABEL_GO_BACK_TO_REAL+], ax
mov [SPValueInRealMode], sp ; 初始化 16 位代码段描述符
mov ax, cs
movzx eax, ax
shl eax,
add eax, LABEL_SEG_CODE16
mov word [LABEL_DESC_CODE16 + ], ax
shr eax,
mov byte [LABEL_DESC_CODE16 + ], al
mov byte [LABEL_DESC_CODE16 + ], ah ; 初始化 32 位代码段描述符
xor eax, eax
mov ax, cs
shl eax,
add eax, LABEL_SEG_CODE32
mov word [LABEL_DESC_CODE32 + ], ax
shr eax,
mov byte [LABEL_DESC_CODE32 + ], al
mov byte [LABEL_DESC_CODE32 + ], ah ; 初始化数据段描述符
xor eax, eax
mov ax, ds
shl eax,
add eax, LABEL_DATA
mov word [LABEL_DESC_DATA + ], ax
shr eax,
mov byte [LABEL_DESC_DATA + ], al
mov byte [LABEL_DESC_DATA + ], ah ; 初始化堆栈段描述符
xor eax, eax
mov ax, ds
shl eax,
add eax, LABEL_STACK
mov word [LABEL_DESC_STACK + ], ax
shr eax,
mov byte [LABEL_DESC_STACK + ], al
mov byte [LABEL_DESC_STACK + ], ah ; 初始化 LDT 在 GDT 中的描述符
xor eax, eax
mov ax, ds
shl eax,
add eax, LABEL_LDT
mov word [LABEL_DESC_LDT + ], ax
shr eax,
mov byte [LABEL_DESC_LDT + ], al
mov byte [LABEL_DESC_LDT + ], ah ; 初始化 LDT 中的描述符
xor eax, eax
mov ax, ds
shl eax,
add eax, LABEL_CODE_A
mov word [LABEL_LDT_DESC_CODEA + ], ax
shr eax,
mov byte [LABEL_LDT_DESC_CODEA + ], al
mov byte [LABEL_LDT_DESC_CODEA + ], ah ; 为加载 GDTR 作准备
xor eax, eax
mov ax, ds
shl eax,
add eax, LABEL_GDT ; eax <- gdt 基地址
mov dword [GdtPtr + ], eax ; [GdtPtr + 2] <- gdt 基地址 ; 加载 GDTR
lgdt [GdtPtr] ; 关中断
cli ; 打开地址线A20
in al, 92h
or al, 00000010b
out 92h, al ; 准备切换到保护模式
mov eax, cr0
or eax,
mov cr0, eax ; 真正进入保护模式
jmp dword SelectorCode32: ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0 处 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LABEL_REAL_ENTRY: ; 从保护模式跳回到实模式就到了这里
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax mov sp, [SPValueInRealMode] in al, 92h ; ┓
and al, 11111101b ; ┣ 关闭 A20 地址线
out 92h, al ; ┛ sti ; 开中断 mov ax, 4c00h ; ┓
int 21h ; ┛回到 DOS
; END of [SECTION .s16] [SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS ] LABEL_SEG_CODE32:
mov ax, SelectorData
mov ds, ax ; 数据段选择子
mov ax, SelectorVideo
mov gs, ax ; 视频段选择子 mov ax, SelectorStack
mov ss, ax ; 堆栈段选择子 mov esp, TopOfStack ; 下面显示一个字符串
mov ah, 0Ch ; 0000: 黑底 1100: 红字
xor esi, esi
xor edi, edi
mov esi, OffsetPMMessage ; 源数据偏移
mov edi, ( * + ) * ; 目的数据偏移。屏幕第 10 行, 第 0 列。
cld
.:
lodsb
test al, al
jz .
mov [gs:edi], ax
add edi,
jmp .
.: ; 显示完毕 call DispReturn ; Load LDT
mov ax, SelectorLDT
lldt ax jmp SelectorLDTCodeA: ; 跳入局部任务 ; ------------------------------------------------------------------------
DispReturn:
push eax
push ebx
mov eax, edi
mov bl,
div bl
and eax, 0FFh
inc eax
mov bl,
mul bl
mov edi, eax
pop ebx
pop eax ret
; DispReturn 结束--------------------------------------------------------- SegCode32Len equ $ - LABEL_SEG_CODE32
; END of [SECTION .s32] ; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN
[BITS ]
LABEL_SEG_CODE16:
; 跳回实模式:
mov ax, SelectorNormal
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax mov eax, cr0
and al, 11111110b
mov cr0, eax LABEL_GO_BACK_TO_REAL:
jmp :LABEL_REAL_ENTRY ; 段地址会在程序开始处被设置成正确的值 Code16Len equ $ - LABEL_SEG_CODE16 ; END of [SECTION .s16code] ; LDT
[SECTION .ldt]
ALIGN
LABEL_LDT:
; 段基址 段界限 属性
LABEL_LDT_DESC_CODEA: Descriptor , CodeALen - , DA_C + DA_32 ; Code, 32 位 LDTLen equ $ - LABEL_LDT ; LDT 选择子
SelectorLDTCodeA equ LABEL_LDT_DESC_CODEA - LABEL_LDT + SA_TIL
; END of [SECTION .ldt] ; CodeA (LDT, 32 位代码段)
[SECTION .la]
ALIGN
[BITS ]
LABEL_CODE_A:
mov ax, SelectorVideo
mov gs, ax ; 视频段选择子(目的) mov edi, ( * + ) * ; 屏幕第 10 行, 第 0 列。
mov ah, 0Ch ; 0000: 黑底 1100: 红字
mov al, 'L'
mov [gs:edi], ax ; 准备经由16位代码段跳回实模式
jmp SelectorCode16:
CodeALen equ $ - LABEL_CODE_A
; END of [SECTION .la]

p45.asm的更多相关文章

  1. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  2. Oracle从文件系统迁移到ASM存储

    环境:RHEL 6.4 + Oracle 11.2.0.4 需求:数据库存储由文件系统迁移到ASM 数据库存储迁移到ASM磁盘组 1.1 编辑参数文件指定新的控制文件路径 1.2 启动数据库到nomo ...

  3. Linux平台oracle 11g单实例 + ASM存储 安装部署 快速参考

    操作环境:Citrix虚拟化环境中申请一个Linux6.4主机(模板)目标:创建单机11g + ASM存储 数据库 1. 主机准备 2. 创建ORACLE 用户和组成员 3. 创建以下目录并赋予对应权 ...

  4. 单机静默安装GI软件并创建ASM实例和ASM磁盘组

    环境:RHEL 6.4 + Oracle 11.2.0.4 需求:单机静默安装GI软件并创建ASM实例和ASM磁盘组,为后续迁移数据库文件到ASM做准备 1. 安装配置GI软件 2. 创建ASM实例 ...

  5. ASM磁盘组扩容流程

    环境:RHEL 6.5 + GI 11.2.0.4 + Oracle 11.2.0.4 1.确认磁盘权限正确 2.图形界面配置 3.启用asmca配置 4.修改磁盘组rebalance power级别 ...

  6. Linux 6.5(oracle 11.2.0.4)单实例ASM安装

    Linux 6.5(oracle 11.2.0.4) 1.解析主机.配置网络等 /etc/hosts /etc/sysconfig/network /etc/init.d/NetworkManager ...

  7. [Storm] Storm与asm的恩恩怨怨

    asm的引用冲突 1. Jersey & Storm 0.9.3 jersey 1.8 (which depends on asm 3.0) Storm 0.93 (which depends ...

  8. 【错误总结】java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor

    运行环境      JDK1.7 64位      Window 7  64位      Ecplise Java EE IDE      Struts 2.3.9      Tomcat 7 说明: ...

  9. 如何将已部署在ASM的资源迁移到ARM中

    使用过Azure的读者都知道,Azure向客户提供了两个管理portal,一个是ASM,一个是ARM,虽然Azure官方没有宣布说淘汰ASM,两个portal可能会在很长的一段时间共存,但是考虑到AR ...

随机推荐

  1. Top 7 Myths about HTTPS

    Myth #7 – HTTPS Never Caches People often claim that HTTPS content is never cached by the browser; p ...

  2. ASP.NET MVC- 视图

    关于视图的一些一些一些 一.Action指定使用视图 public ActionResult Add(string txtName, string txtContent) { return View( ...

  3. easyui datagrid 的分页刷新按钮

    datagrid  刷新bug: 情形: 当用户A,B  同时操作 datagrid时(记录1,记录2.记录3).如果A如果删除记录1,  B此时已选中了记录1 ,记录2 , 这时B点击分页中的刷新按 ...

  4. HttpContext及HttpContext.current

    慎用System.Web.HttpContext.Current http://www.cnblogs.com/david1989/p/3879201.html 线程编程中用到HttpContext. ...

  5. canvas 动态飞速旋转的矩形

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. Unity学习笔记(一)——基本概念之场景(Scene)

    场景,顾名思义就是我们在游戏中所看到的物品.建筑.人物.背景.声音.特效等,基本上和我们玩游戏时所看到的游戏“场景”是同一个概念. Unity 3D中,“场景”是一个视图,我们通过“场景”这个视图,来 ...

  7. OpenCV 图像处理学习笔记(一)

    解读IplImage结构 typedef struct _IplImage { int nSize;                    /* IplImage大小 */ int ID;       ...

  8. linux集群管理<转>

    云在根本上是由硬件和软件组成的,这些组件需要经常细心地维护.出现故障的硬件需要修理或更换:软件需要应用补丁.更新和升级:必须根据需求和潜在的安全威胁提前配置系统.应用程序开发人员可能觉得计算云很方便. ...

  9. Slony-I中对storelisten出错的处理

    客户质询的现象是: Slony-I运行中,log中发现FATAL信息: FATAL storeListen: unknown node ID 出现了上述错误后,再看后继的log,又恢复正常运行了. 客 ...

  10. 计算Excel中的Sheet个数

    $strpath="d:\ee.xlsx"$excel=new-object -comobject excel.application$WorkBook = $excel.Work ...