本文主要是介绍使用freedos 实现保护模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下载freedos并启动
1:在网站http://bochs.sourceforge.net/guestos/freedos-img.tar.gz 上下载FreeDos,
采用tar vxzf FreeDos.img.tar.gz 解压
cd freedos-img //进入文件夹 之后将a.img的文件重命名为freedos.img,将其复制到bochs工作的当前文件夹。
freedos入门
2:采用上节的方法用~$ bximage 生成一个新的软盘映像 起名为pm.img //步骤同上次一样,唯一不同的就是上次生成的文件名a.img直接回车了,这次需要输入pm.img
此时当前工作目录下就多了一个pm.img文件
3:修改当前工作目录下的bochsrc配置文件
增加如下几行:floppya: 1_44="freedos.img", status=insertedfloppyb: 1_44="pm.img", status=insertedboot: a
4:启动bochs
5:格式化b盘
format b
6、编译程序
nasm 3_pmtest1.asm -o pmtest1.com
7、将编译结果装入
sudo mount -o loop pm.img /mnt/floppy/
sudo cp pmtest1.com /mnt/floppy/
sudo umount /mnt/floppy
如果挂载点不存在,就在mnt 文件夹下创建文件夹 floppy
8、再dos中执行代码 B:\排名test.com
代码 pmtest1.asm
; ==========================================
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.bin
; ==========================================%include "pm.inc" ; 常量, 宏, 以及一些说明org 0100h
jmp LABEL_BEGIN[SECTION .gdt]
; GDT
; 段基址, 段界限 , 属性
LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
; GDT 结束GdtLen equ $ - LABEL_GDT ; GDT长度
GdtPtr dw GdtLen - 1 ; GDT界限dd 0 ; GDT基地址; GDT 选择子
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
; END of [SECTION .gdt][SECTION .s16]
[BITS 16]
LABEL_BEGIN:mov ax, csmov ds, axmov es, axmov ss, axmov sp, 0100h; 初始化 32 位代码段描述符xor eax, eaxmov ax, csshl eax, 4add eax, LABEL_SEG_CODE32mov word [LABEL_DESC_CODE32 + 2], axshr eax, 16mov byte [LABEL_DESC_CODE32 + 4], almov byte [LABEL_DESC_CODE32 + 7], ah; 为加载 GDTR 作准备xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_GDT ; eax <- gdt 基地址mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址; 加载 GDTRlgdt [GdtPtr]; 关中断cli; 打开地址线A20in al, 92hor al, 00000010bout 92h, al; 准备切换到保护模式mov eax, cr0or eax, 1mov cr0, eax; 真正进入保护模式jmp dword SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs,; 并跳转到 Code32Selector:0 处
; END of [SECTION .s16][SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS 32]LABEL_SEG_CODE32:mov ax, SelectorVideomov gs, ax ; 视频段选择子(目的)mov edi, (80 * 11 + 79) * 2 ; 屏幕第 11 行, 第 79 列。mov ah, 0Ch ; 0000: 黑底 1100: 红字mov al, 'P'mov [gs:edi], ax; 到此停止jmp $SegCode32Len equ $ - LABEL_SEG_CODE32
; END of [SECTION .s32]
这篇关于使用freedos 实现保护模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!