使用freedos 实现保护模式

2023-10-09 21:50

本文主要是介绍使用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 实现保护模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175786

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的