操作系统实现-简单热身

博客网址:www.shicoder.top
微信:18223081347
欢迎加群聊天 :452380935

这次对上次的boot.asm进行代码讲解,也可以对汇编的相关理论进行补充

主引导扇区位于硬盘的0柱面0磁头1扇区处,首先BIOS加电后,就会将主引导程序加载进来,然后执行

我们先看下boot.asm中有啥把

[org 0x7c00]

; 设置屏幕模式为文本模式,清除屏幕
mov ax, 3
int 0x10

; 初始化段寄存器
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00

; 0xb8000 文本显示器的内存区域
mov ax, 0xb800
mov ds, ax
mov byte [0], 'H'

; 阻塞
jmp $

; 填充 0
times 510 - ($ - $$) db 0

; 主引导扇区的最后两个字节必须是 0x55 0xaa
; dw 0xaa55
db 0x55, 0xaa
  • 0x7c00

因为bios在上电之后,会去将boot主引导程序加载到0x7c00,然后利用一个跳转,跳到0x7c00处执行,因此我们需要将boot.asm代码放在0x7c00处,org便是这个功能

  • 设置屏幕为文本模式
mov ax, 3
int 0x10

int 0x10为bios中断服务,给定不同的ax,会进行不同的调用程序,下表给出ax=3时候的程序

AL 文字/图形 分表率 颜色 00 文字 4025 2 01 文字 4025 16 02 文字 8025 2 03 文字 8025 16 04 图形 320320 2 05 图形 320320 4 06 图形 640*200 2

  • 初始化段寄存器

因为不能使用 mov ds,0这种,因此借助 ax进行初始化

  • 显示文本

由于BIOS加载之后,还是实模式,为了在这个模式下显示文本,我们需要知道要在哪个内存区域进行显示,下面给出实模式下的内存区域

起始地址 结束地址 大小 用途

1KB 中断向量表

256B BIOS 数据区

29.75 KB 可用区域

512B MBR 加载区域

607.6KB 可用区域

1KB 扩展 BIOS 数据区

64KB 用于彩色显示适配器

32KB 用于黑白显示适配器

32KB 用于文本显示适配器

32KB 显示适配器 BIOS

160KB 映射内存

64KB-16B 系统 BIOS

16B 系统 BIOS 入口地址

可以看出在0xb8000处可以显示文本,因此

mov ax, 0xb800
mov ds, ax
mov byte [0], 'H'
相当于是 move byte ds:[0], 'H'
实模式下寻址方式为
( 16 位段基址 << 4 ) + 16 位偏移地址
ds << 4 + 0 = 0xb8000
  • 0x55aa

若一段程序结束的魔数为0x55aa,BIOS才会认为是合格的主引导程序

注意,在汇编代码中,若定义一个数字 ,左边是高位
比如 dw 0xaa55,则编译之后,aa在高位

Original: https://www.cnblogs.com/shilinkun/p/16230050.html
Author: 小坤学习园
Title: 操作系统实现-简单热身

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • thinkphp5简单使用redis缓存

    csharp;gutter:true; connect("127.0.0.1","6379");</p> <pre>…

    Linux 2023年5月28日
    0122
  • Linux运行Jar包方式

    1 运行Jar包 第一种方式 java -jar xxx.jar 最基本的方式,程序运行的信息会一直输出在控制台,ctrl+c中断或者关闭窗口时,程序中断执行。 第二种方式 jav…

    Linux 2023年6月7日
    0116
  • 4.3 Linux压缩文件或目录为.zip格式(zip命令)

    我们经常会在 Windows 系统上使用 “.zip”格式压缩文件,其实”.zip”格式文件是 Windows 和 Linux 系统…

    Linux 2023年6月7日
    0112
  • SpringBoot-swagger

    SpringBoot整合swagger SpringBoot-swagger 13.1 导入相关依赖 io.springfox springfox-swagger-ui 2.9.2…

    Linux 2023年6月14日
    0100
  • Redis入门讲解(介绍、安装、常用命令)

    Redis入门讲解(介绍、安装、常用命令) Redis是非关系型数据库 关系型数据库 关系型数据库是采用了关系模型来组织数据的数据库,以行和列的形式存储数据,由二维表及其之间的关系…

    Linux 2023年6月6日
    0115
  • 6.18(反射和注解—>反射机制的作用)

    反射 获取Class对象三种方式第一种方式:类.class第二种方式:对象.getClass()第三种方式:Class.forName &#x5728;&#x4E0…

    Linux 2023年6月7日
    0128
  • .NET 20 周年

    更多请移步:https://dotnet.microsoft.com/zh-cn/ 作者:猫叔Vincent 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,…

    Linux 2023年6月13日
    0152
  • Pycharm设置python文件头

    设置路径为: File->Setting->Editor->File and code Templates->Python Script 可用的预定义文件模…

    Linux 2023年6月8日
    0119
  • 常见网络安全设备

    一、防火墙定位:访问控制类产品,网络出现后的第一类安全产品。功能:隔离内网、外网以及DMZ区(业务系统对外发布区,Web应用服务器,邮件服务器等)并控制用户访问。部署方式:通常部署…

    Linux 2023年6月14日
    095
  • python写日志

    写日志的办法多种多样,我这个是我喜欢的办法,可以做个参考 没啥说的,直接上代码 import time def write_log(value): now_time = time….

    Linux 2023年6月6日
    095
  • opencv

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月14日
    0119
  • jmeter 性能测试 报错信息“address already in use:connect”解决方法

    jmeter性能测试报”address already in use:connect” 报错信息 原因分析: 这个问题的原因是windows端口被耗尽了(默…

    Linux 2023年6月8日
    0110
  • Java List和Map遍历的方法,forEach()的使用

    注意: 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。 Java 8之前 …

    Linux 2023年6月7日
    0115
  • 【Leetcode】198. 打家劫舍

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动…

    Linux 2023年6月6日
    0109
  • Redis安装及HA(High Availability)配置

    Redis是一种内存数据库,以KEY-VALUE(即键值对)的形式存储数据。这篇文章主要介绍的是Redis安装及配置,所以不对Redis本身作详细介绍了。 下 载: 解 压: 以r…

    Linux 2023年5月28日
    093
  • Windows Server 新增磁盘处于脱机状态解决办法

    解决方案: Cmd命令行操作如下: 1,进入diskpart模式 2、列出磁盘情况 3、选择脱机的磁盘 4、联机磁盘 5、清除磁盘属性 6、进入磁盘管理,提示初始化 每天记录一点,…

    Linux 2023年6月8日
    0117
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球