自己编写操作系统的笔记3
2009-03-24 20:13
357 查看
今天研究了很长的时间,效果是显著的,可是结果……还是没有成功。
今天主要研究怎么进入保护模式。于渊 的nasm写的总是好像很简单,可是lgdt [GdtPtr],jmp dword SelectorCode32:0,mov [gs:edi], ax怎么也改不出可以编译通过的代码。
这是代码:
然后在网上找了一天的资料,发现一本80x86汇编语言程序设计教程的书,比我原先看的IBM汇编语言好了不知多少倍,把段、保护模式讲的几乎没什么秘密了。可惜目前没有书,电子版又很不好看,研究的很慢。
besides,发现了上个日志中的那个网站,帮助不能说没有,可是他改的有些晦涩,主要有些偏移地址无法了解。看来今天参不透了。
目前的问题是lgdt [GdtPtr],jmp dword SelectorCode32:0,mov [gs:edi], ax用masm怎么写,为什么。
我的错误信息是
Assembling: protectmodetest.asm
protectmodetest.asm(50) : error A2085:
protectmodetest.asm(66) : error A2096:
protectmodetest.asm(75) : error A2032:
希望知道的朋友帮忙告一下
今天主要研究怎么进入保护模式。于渊 的nasm写的总是好像很简单,可是lgdt [GdtPtr],jmp dword SelectorCode32:0,mov [gs:edi], ax怎么也改不出可以编译通过的代码。
这是代码:
Title ProtectModeTest.asm .386 include function.inc code segment use32 start: org 0100h jmp LABEL_BEGIN ; GDT ; 段基址, 段界限 , 属性 LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段, 32 LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址 ; GDT 结束 GdtLen equ $ - LABEL_GDT ; GDT长度 GdtPtr dw GdtLen ; GDT界限 dd 0 ; GDT基地址 ; GDT 选择子 SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT LABEL_BEGIN: mov ax, cs mov ds, ax mov es, ax mov ss, ax mov sp, 0100h ; 初始化 32 位代码段描述符 xor eax, eax mov ax, cs shl eax, 4 add eax, LABEL_SEG_CODE32 mov word ptr [LABEL_DESC_CODE32 + 2],ax shr eax, 16 mov byte ptr [LABEL_DESC_CODE32 + 4], al mov byte ptr [LABEL_DESC_CODE32 + 7],ah ; 为加载 GDTR 作准备 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_GDT ; eax <- gdt 基地址 mov dword ptr [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址 ; 加载 GDTR lgdt GdtPtr ; 关中断 cli ; 打开地址线A20 in al, 92h or al, 00000010b out 92h, al ; 准备切换到保护模式 mov eax, cr0 or eax, 1 mov cr0, eax ; 真正进入保护模式 jmp SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0 处 LABEL_SEG_CODE32: mov ax, SelectorVideo mov gs, ax ; 视频段选择子(目的) mov edi, (80 * 10 + 0) * 2 ; 屏幕第 10 行, 第 0 列。 mov ah, 0Ch ; 0000: 黑底 1100: 红字 mov al, 'P' mov word ptr [gs:edi],ax ; 到此停止 jmp $ SegCode32Len equ $ - LABEL_SEG_CODE32 code ends end start
然后在网上找了一天的资料,发现一本80x86汇编语言程序设计教程的书,比我原先看的IBM汇编语言好了不知多少倍,把段、保护模式讲的几乎没什么秘密了。可惜目前没有书,电子版又很不好看,研究的很慢。
besides,发现了上个日志中的那个网站,帮助不能说没有,可是他改的有些晦涩,主要有些偏移地址无法了解。看来今天参不透了。
目前的问题是lgdt [GdtPtr],jmp dword SelectorCode32:0,mov [gs:edi], ax用masm怎么写,为什么。
我的错误信息是
Assembling: protectmodetest.asm
protectmodetest.asm(50) : error A2085:
protectmodetest.asm(66) : error A2096:
protectmodetest.asm(75) : error A2032:
希望知道的朋友帮忙告一下
相关文章推荐
- 自己编写操作系统的笔记7
- 自己编写操作系统的笔记6
- 自己编写操作系统的笔记4
- 《自己动手编写操作系统》笔记
- 自己编写操作系统的笔记1
- 自己编写操作系统的笔记2
- 自己编写操作系统的笔记5
- 自己写操作系统 笔记1
- IOS开发笔记 (3)---objective c 自己编写测试示例
- 【学习笔记】自己动手写操作系统--pmtest3
- 《30天编写自己的操作系统》 关于如何让虚拟机从U盘启动
- 【学习笔记】自己动手写操作系统--pmtest1
- 遗传算法与直接搜索工具箱学习笔记 二-----编写自己的目标函数
- 自己动手写操作系统--笔记之安装DOS
- 自己动手写操作系统之第一部分笔记
- 操作系统编写视频教程(自己写操作系统)
- 自己动手写操作系统 笔记
- 自己动手编写操作系统
- Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain
- 【学习笔记】自己动手写操作系统——pmtest2