第三天(续)

第三小节

注明一下,源代码中有很多原作者留的日文注释,我没去一条一条删去,不管就行了

harib00c:

readloop:MOV     SI,0            ; 记录失败次数的寄存器
retry:MOV       AH,0x02         ; AH=0x02 : 僨傿僗僋撉傒崬傒MOV        AL,1            ; 1个扇区MOV       BX,0MOV     DL,0x00         ; A僪儔僀僽INT      0x13            ; 僨傿僗僋BIOS屇傃弌偟JNC       next            ; 僄儔乕偑偍偒側偗傟偽next傊ADD        SI,1            ; SI加一CMP       SI,5            ; 比较SI和5JAE     error           ; SI >= 5 跳errorMOV     AH,0x00MOV      DL,0x00         ; A僪儔僀僽INT      0x13            ; 僪儔僀僽偺儕僙僢僩JMP      retry
next:MOV        AX,ES           ; 内存后移0x200ADD      AX,0x0020MOV        ES,AX           ; ADD ES,0x020 偲偄偆柦椷偑側偄偺偱偙偆偟偰偄傞ADD      CL,1            ; CL偵1傪懌偡CMP        CL,18           ; CL偲18傪斾妑JBE       readloop        ; CL <= 18 偩偭偨傜readloop傊

之所以不在INT 0x13中用MOV AL,0x17指定18个扇区,是因为BIOS在读盘时,指定处理的扇区数时有限制,作者这里也没有说清楚,但在Bochs 2.4.5中不能一次指定72个扇区以上。

7220       if ((drive > 1) || (head > 1) || (sector == 0) ||
7221           (num_sectors == 0) || (num_sectors > 72)) {
7222         BX_INFO("int13_diskette: read/write/verify: parameter out of range\n");
7223         SET_AH(1);
7224         set_diskette_ret_status(1);
7225         SET_AL(0); // no sectors read
7226         SET_CF(); // error occurred
7227         return;
7228       }

具体可以看下这个:https://stackoverflow.com/questions/62483420/int-13h-effective-sector-size

Bochs

bochs是X86硬件平台的开源模拟器,完全可以通过软件来给我们提供各种所需的硬件资源。

和bochs类似的虚拟机软件还有我们常用的VMware、Virtuabox,但区别也是明显的。

bochs是完全依靠软件来模拟整个环境的:从启动到重启包括PC的外设键盘、鼠标、磁盘以及网卡等,全部都是由软件来模拟的,而其余软件则不然(部分依赖于硬件)。

现在0x8200~0xa3ff中装载了磁盘的512×17=8704个字节(一个扇区512字节)


第四小节

harib00d

CYLS EQU     10              ; 相当于C语言的#define CYLS = 10,EQU是equal的缩写,相当于"="
·····
next:MOV        AX,ES           ; 傾僪儗僗傪0x200恑傔傞ADD      AX,0x0020MOV        ES,AX           ; ADD ES,0x020 偲偄偆柦椷偑側偄偺偱偙偆偟偰偄傞ADD      CL,1            ; CL偵1傪懌偡CMP        CL,18           ; CL偲18傪斾妑JBE       readloop        ; CL <= 18 偩偭偨傜readloop傊MOV     CL,1ADD     DH,1CMP     DH,2JB      readloop        ; DH < 2 偩偭偨傜readloop傊MOV        DH,0ADD     CH,1CMP     CH,CYLSJB       readloop        ; CH < CYLS 偩偭偨傜readloop傊

扇区:C0-H0-S1:柱面0,磁头0,扇区1,柱面cylinder,磁头head,扇区sector

10×2×18×512=184320byte=180KB 十个柱面


第五、六小节

非常好的一张图片,说明了软盘的存储结构

软盘保存文件,文件名会写在0x002600处,文件的内容会写在0x004200之后的地方

用make install命令将haribote.nas用nask编译输出为sys文件

我遇到如下报错,但是不影响sys文件的生成

磁盘上0x004200号地址的程序,因为装载到内存中是从0x8000号地址开始的,因此磁盘0x4200处的内容在内存0x8000+0x4200=0xc200处

注意此时引导区的文件差不多就写完了为ipl.nas


第七小节

http://oswiki.osask.jp/?(AT)BIOS

还是上面那个日文网页

有个问题,为啥是内存的0x0ff0,搜了一下也没有解释,求指教

; haribote.nas文件
; 因为(磁盘上10个柱面的数据)读完了执行haribote.sys!MOV        [0x0ff0],CH        ; 将 读取柱面的数量(此时是10)写到内存的0x0FF0,为什么是0x0FF0?JMP        0xc200

make run结果:黑屏


第八小节

; haribote-os
; TAB=4; 有关BOOT_INFO
CYLS    EQU     0x0ff0          ; 僽乕僩僙僋僞偑愝掕偡傞
LEDS    EQU     0x0ff1
VMODE   EQU     0x0ff2          ; 怓悢偵娭偡傞忣曬丅壗價僢僩僇儔乕偐丠
SCRNX   EQU     0x0ff4          ; 夝憸搙偺X
SCRNY   EQU     0x0ff6          ; 夝憸搙偺Y
VRAM    EQU     0x0ff8          ; 僌儔僼傿僢僋僶僢僼傽偺奐巒斣抧ORG        0xc200          ; 偙偺僾儘僌儔儉偑偳偙偵撉傒崬傑傟傞偺偐MOV        AL,0x13         ; VGA僌儔僼傿僢僋僗丄320x200x8bit僇儔乕MOV     AH,0x00INT      0x10MOV     BYTE [VMODE],8  ; 记录画面模式,指令中制定了BYTE,则用8个位来存储8这个数值,内存地址为VMODE,即0x0ff2MOV     WORD [SCRNX],320; 一个字来存储MOV     WORD [SCRNY],200MOV     DWORD [VRAM],0x000a0000 ; 双字; MOV       AH,0x02INT      0x16            ; keyboard BIOSMOV      [LEDS],AL

按键锁定和换档状态获取

INT=0x16

AH= 0x02状态下的AL返回值:

bit0:右移

bit1:左移

bit2:控制

bit3:Alt

bit4:滚动锁定

bit5:数字锁

bit6:大写锁定

bit7:插入模式

(翻译还是Google翻译的准

好家伙,github上有汉化了的,让我看日文看了这么久(—_—) https://github.com/yourtion/30dayMakeOS

不过给出的文件都是一天的最终版,没有一天里逐步改进的过程


第九小节

添加了亿点点细节

主要加的功能是把.c变为.sys文件

具体内容(如何调用C语言写的程序)作者说后面再讲


第十节

WCOFF模式搜不到,但COFF是指通用对象文件格式

; naskfunc.nas文件
; naskfunc
; TAB=4[FORMAT "WCOFF"]              ; 制作目标文件的模式
[BITS 32]                       ; 制作32位模式用的机器语言; 制作目标文件的信息[FILE "naskfunc.nas"]           ; 源文件名信息GLOBAL  _io_hlt         ; 程序中包含的函数名; 以下是实际的函数[SECTION .text]        ; 目标文件中写了这些后再写程序_io_hlt:    ; void io_hlt(void);HLTRET
//bootpack.c文件
/* 告诉C编译器,有一个函数在别的文件里 */void io_hlt(void);/* 是函数声明却不用{},而用;,这表示的意思是:函数在别的文件中,你自己找一下 */void HariMain(void)
{fin:io_hlt(); /* 执行naskfunc.nas中的_io_hlt函数 */goto fin;}

c++中一个文件怎么调用另外一个文件里的函数:

前提为,另一个文件中的函数,不能是静态函数,即不能有static修饰。
调用方法,在调用前进行声明,然后直接调用即可。

声明方法:
1 直接在调用前,写函数声明:
如调用函数为int func(int a),那么在调用前只需要
int func(int a);
这样声明后,即可使用func。

2 将声明写在头文件中。
如在名为func.h的头文件中加入
int func(int a);
然后在调用的源文件中,引用
#include “func.h”

即可调用func

此处属于第一种,但是还未使用io_hlt函数

修饰。

调用方法,在调用前进行声明,然后直接调用即可。

声明方法:
1 直接在调用前,写函数声明:
如调用函数为int func(int a),那么在调用前只需要
int func(int a);
这样声明后,即可使用func。

2 将声明写在头文件中。
如在名为func.h的头文件中加入
int func(int a);
然后在调用的源文件中,引用
#include “func.h”

即可调用func

此处属于第一种,但是还未使用io_hlt函数

话说作者第三天是不是打了鸡血。。。


欢迎一起学习和讨论

欢迎关注个人其他账号:

B站账号:哔哩哔哩 无名-易

Gitee账号:gitee账号

GitHub账号:GitHub

30天自制操作系统——第三天相关推荐

  1. 30天自制操作系统第三天

    操作系统实验日志3 学号 201708010402 姓名 徐冰娜 专业年级班级 实验日期 2019.9.28 实验项目 第3天:进入32位模式并导入C语言 智能1701 30天自制操作系统第三天 操作 ...

  2. 30天自制操作系统:第三天 进入32位模式并导入C语言

    今天的内容稍稍有点多,一起看看吧 1.制作真正的IPL 到昨天为止,讲到的启动区虽然也称为IPL(Initial Program Loader,启动程序装载器),但它实质上并没有装载任何程序. 小节中 ...

  3. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

  4. 发布在《30天自制操作系统》之前的帮助阅读贴

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

  5. 写在《30天自制操作系统》上市之前

       这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...

  6. 30天自制操作系统 导读

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

  7. 30天自制操作系统——第五天

    第五天 参考<30天自制操作系统>GDT&IDT - 谷月轩 - 博客 梳理一下文件 现在我们拥有这么9个文件: ipl10.nas InitialProgramLoader, 占 ...

  8. 【操作系统】30天自制操作系统--(9)叠加处理

    这一章主要是处理之前遇到的图层叠加的问题.[操作系统]30天自制操作系统--(7)鼠标移动与32位切换 一 内存管理优化 上一章的内存管理虽然写好,但是还是有不完善的地方.因为如果不对申请内存的大小有 ...

  9. 30天自制操作系统 - 取代软盘,用U盘写入引导扇区

    背景 作者是在2006年发布此书的(翻译版是在2012年在中国发售),当时可能还能找到带有软驱的计算机.但是时过境迁,现在已经不存在这种老古董东西了. 简单总结一下学习到第三天的一些更变. 更变 书籍 ...

  10. 30天自制操作系统——第二天

    30天自制操作系统--第二天 今天是该系列的第二天,继续昨天的开发,今天的任务主要有以下几项: 1.进一步的加工一下汇编程序(去除昨天的二进制代码) 2.对启动区进行制作 3.利用makefile简化 ...

最新文章

  1. eeglab教程系列(13)-学习和删除ICA组件
  2. 苹果成AI“收购狂魔”,5年买下25家公司
  3. zip伪加密做法及原理
  4. Trains 归纳法
  5. apache 网页301重定向、自定义400/403/404/500错误页面
  6. 通过minicom传送文件的相关配置及使用方法
  7. MyBatis源码阅读(九) --- 插件原理
  8. 基于Springboot的医院药品管理系统的设计与实现.zip(论文+项目源码)
  9. 暂时解决Xmarks无法同步
  10. Required request body is missing:ParameterException解决方法
  11. run npm fund for details
  12. 9月全球搜索引擎市场份额:7个版本Google上榜
  13. 城市文化笔记整理(二)
  14. 惠普暗影精灵6安装Ubuntu双系统显卡及Wi-Fi问题解决
  15. 文件操作与文件夹操作
  16. mac改成类似微软键盘偏好设置
  17. 小功能⭐️Unity快捷键、路径及常用特性
  18. DA-DSUnet: Dual Attention-based Dense SU-net for automatic headand-neck tumor segmentation in MRI im
  19. 如何学习单片机编程?
  20. AI讲师人工智能讲师机器学习讲师深度学习讲师叶梓简历(机器学习深度学习强化学习人工智能老师)

热门文章

  1. mybatisplus-代码级别的自动生成创建丶更新时间
  2. openpose的搭建
  3. 破解Photoshop cs6
  4. 制作FlappyBird时出现的一些问题
  5. (实验)完成一个医院挂号系统
  6. Python定时爬虫脚本
  7. ck6.8整合php,CKplayer-超酷网页视频播放器
  8. 2011计算机一级a,计算机一级A2011 上海.doc
  9. JavaScript中的浮点运算
  10. 内存管理基础学习笔记 - 4.2 缺页中断处理 - do_page_fault