当前位置: 首页 > news >正文

30填学习自制操作系统第二天

今天要干什么?

  1. 初步了解汇编语言
  2. 使用汇编重新写个昨天的镜像文件
  3. 继续开发

一:

什么是电信号?

电脑的处理中心是CPU,即“central process unit”的缩写,翻译成中文就是“中央处理单元”,顾名思义,他就是处理中心。如果我们吧背的原件当作中心来使用的化,那他就叫做CPU了,所以无论什么时候CPU都总是处理中心。不过这个CPU除了与别的电路进行电信号交换以外什么都不会,而且对于电信号只有0(开或关)1 两种状态,就是个集成电路版,只是忠实的执行电信号给他的指令,输出相应的电信号。

0000 0000 0000 0000 0000 0100 1010 0010 这32个电信号的集合来表示1186这个整数。(注:用二进制表示1186的话,就是0100 1010 0010)

虽然二进制与电信号有很好的一一对应关系,但他有一个缺点,那就是位数太多了,举个例子来说,如果我们把1234写成二进制数,就成了0100 1101 0010,长达11位,而写成十进制数,只用4位就够了。因为这样太浪费内存了,所以计算机业界普遍使用十六进制数。十六进制数的1234写成十六进制就是4D2,只用3位就够了。

二进制数和十六进制数对照表

0000 - 0

0001 -1

0010 - 2

0011 - 3

0100 - 4

0101 -5

0110 - 6

0111 -7

1000 - 8

1001 -9

1010 -A(10)

1011 -B(11)

1100 -C(12)

1101 -D(13)

1110 -E(14)

1111 -F(15)

十六进制转换:4D2  == 0100 1101 0010

用汇编语言再写一个hello.img

作者给的汇编工具不能用了,使用DosBox

DOSBox, an x86 emulator with DOS
https://www.masm32.com/download.htm

在D盘下创建文件:masm包含:4个文件:masm.exe,link.exe,debug.exe,exe2bin.exe

文件1:masm.exe:汇编程序,用于汇编源程序(*.asm),得到目标程序(*.obj);

文件2:link.exe:连接程序,用于连接目标程序,得到可执行程序(*.exe);

文件3:debug.exe:调试程序,用于调试可执行程序

在DOSBox安装路径:双击DOSBox 0.74-3 option.bat 会跳出文件dosbox*.conf,在文件末尾填入以下两行后保存关闭,[axtoexec]后面:

其中d:\masm位存放masm.exe、link.exe、debug.exe等文件,第一行指定masm目录,第二行进行c盘

mount c d:\masm

c:

常用的命令:

mount <虚拟盘符><本地路径>:mount c d:\masm # 将本地目录d:\masm挂在为虚拟C盘

dir :常用参数 /w仅显示文件名,/p分页显示,*.exe筛选文件。例子:dir  /w *.exe   # 列出当前目录所有exe文件

del:删除文件 del old.exe # 删除单个文件

deltree: 删除目录及子文件 # deltree temp # 强制删除temp目录

debug:启动debug模式 # 输入debug进入调试环境,常用命令

R:AX # 查看/修改寄存器

D:05 #显示DS段0-5单元的数据(查看内存)

E: 1000 ‘Hello’ #在内存地址1000处写入字符串,写完再用d 1000查看测试

U:050 # 将0-50H地址的机器码转为汇编指令

T #执行当前CS:IP 指向的指令(单步执行)

G : 运行程序(debug hello.exe后输入g回车即可看到hello world)

q:推出debug

汇编程序编译:

masm hello.asm # 生成obj文件

Link hello.obj; # 生成exe文件

例子:手打一下吧,手写一个hello.asm文件,在运行上面的命令

快捷键:

Alt+Enter:切换全屏模式

Ctrl+F10: 释放鼠标锁定

Ctrl+F4:刷新虚拟驱动器(更新挂载目录内容)

Ctrl+F7:降低模拟速度(解决光标闪烁问题)

二:汇编重新编写脚本生成img镜像文件

就是把上面所有的16进制文件,在重新写一遍加上符合汇编格式的0x开头,这样要写的内容太多了,所以优化了一个脚本去写

按照作者的讲述流程 根据bat脚本 使用作者给的nask.exe 文件去执行nas文件

bat脚本文件

..\z_tools\nask.exe helloos.nas hellosc.img

作者给的nask文件在z_tools文件夹中

“;命令”,这个是注释命令,相当于C语言或者C++中的”//”

DB指令的新用法,我们居然可以用它写字符串。在写字符串的时候,汇编语言会自动查找字符串中每一个字符所对应的编码,然后把他们一个字节一个字节的排列起来。这个功能非常方便。

DW指令和DD指令,他们分别是”data word“和”data double-word“的缩写,是DB指令的”堂兄弟“。Word的本意是”单词“,但在计算机汇编语言中,word指的是16位的意思,也就是2个字节。”double-word“是32位的意思,也就是4个字节。

RESB 0x1fe-$.这个美元符号的意思(可以告诉我们这一行现在的字节数)(如果严格来说,有时候他还会有别的意思)在这个程序里,我们已经在前面输出了132个字节,所以这里的$就是132.因此nask先用0x1fe减去132,得出378这一结果,然后连续使出378个字节的0x00.

$相当于一个检查固定长度的值,因为输出的”hello world“内容有可能会变化,中间要输出的0x00字节数也会随之变化。为什么呢(必须要保证软盘的第510个字节,即ox1fe字节)开始的地方是55 AA。

注释:专业术语

TAB = 4 .。。。。。。 文本编辑器调整TAB键的宽度

FAT12格式。。。。。(FAT12 Format)用windows或MS-DOS格式化出来的软件就是这种格式。我们的helloos也是这种格式,其中容纳了我们开发的操作系统。这个格式兼容性好,在window上也能用

启动区。。。。。。。(boot sector)软盘第一个的扇区称为启动区。什么是扇区呢?计算机读写软盘的时候,并不是一个字节一个字节的读写的,而是以512字节为一个单位进行读写。因此,软盘的512字节就称为一个扇区。一张软盘的空间共有1440KB,也就是1440*1024=1474560字节,除以512得2880,这也就是说一张软盘共有2880个扇区。

为什么第一个扇区称为启动区呢?计算机首先从最初一个扇区开始读软盘,然后去检查这个扇区最后两个字节的内容。

  如果这最后两个字节不是55 AA,计算机会认为这张软盘上没有所需的启动程序,就会报一个不能启动的错误(也许有人问为什么一定是55 AA呢,那是当初的设计者定的,笔者也没法解释)。如果计算机确认了第一个扇区的最后两个字节正好是55 AA,那他就认为这个扇区的开头是启动程序,并开始执行。

IPL。。。。Initial program loader的缩写,启动程序加载器。启动区只有区区512个字节,实际的操作系统不会这么小,跟本装不进去,几乎所有操作系统,都是把加载操作系统本身的程序放在启动区里面的。有鉴于此,有时也将启动区称为IPL

启动......(bootstrap)boot这个词本是长靴(boots)的单数形式。他与计算机的启动有什么关系呢?

一般应该将启动称之为start的。Bootstrap在网络上有自力更生完成任务这种意思,也可以叫做操作系统的自动启动机制,被称为bootstrap方式。

三:继续开发

对原有的helloos.nas进行了再次开发,其中用到了一些新的指令:

1:“MOV AX,0”,相当于”AX=0;”这样一个赋值语句。同样,”MOV SS,AX”就相当于”SS=AX;“,相当于变量空间赋值语句。

2:再来说说AX和SS是什么。CPU里有一种名为寄存器的储存电路,相当于机器语言中的变量,具体有代表性的寄存器有8个.

AX--accumulator,累加寄存器

CX-counter, 计数寄存器

DX-data, 数据寄存器

BX-base,基址寄存器

SP-stack pointer,基址指针寄存器

BP-base-pointer,基址指针寄存器

SI-source index,源变址寄存器

DI-destination index,目的变址寄存器

这些寄存器全都是16位寄存器,因此可以存储16位的二进制数

参考链接:
30天自制操作系统——第二天_30 天自制操作系统-CSDN博客

(初学者)使用DOSBox编写汇编程序_dos box 中masm指令时出现1 severe errors怎么办-CSDN博客

汇编语言学习篇2——MASM的环境搭建(win10与Ubuntu1604下的配置)【有问题,待更正】-CSDN博客

相关文章:

30填学习自制操作系统第二天

今天要干什么&#xff1f; 初步了解汇编语言使用汇编重新写个昨天的镜像文件继续开发 一: 什么是电信号&#xff1f; 电脑的处理中心是CPU&#xff0c;即“central process unit”的缩写&#xff0c;翻译成中文就是“中央处理单元”&#xff0c;顾名思义&#xff0c;他就是…...

MapReduce的工作原理及其在大数据处理中的应用

MapReduce是一种由Google提出的面向大数据并行处理的计算模型、框架和平台&#xff0c;它通过将复杂的数据处理任务分解为两个简单的阶段——Map&#xff08;映射&#xff09;和Reduce&#xff08;归约&#xff09;&#xff0c;实现了分布式并行计算&#xff0c;极大地提高了数…...

vue3.x 的provide 与 inject详细解读

在 Vue 3.x 中&#xff0c;provide 和 inject 是一对用于实现依赖注入的 API。它们允许父组件向其所有子组件&#xff08;无论嵌套多深&#xff09;传递数据或方法&#xff0c;而不需要通过 props 逐层传递。这在开发复杂组件或高阶组件时非常有用。 1. provide 的基本用法 p…...

c#中“事件-event”的经典示例与理解

在C#编程语言中&#xff0c;事件&#xff08;Event&#xff09;是一个非常重要的概念&#xff0c;它提供了一种松耦合的方式&#xff0c;让对象间能够通知彼此&#xff0c;而无需直接联系。事件的使用可以让我们的代码更加灵活、可扩展且易于维护。 事件可以视作委托的实例&…...

《第三代大语言模型Grok 3:闪亮登场》

《第三代大语言模型Grok 3:闪亮登场》 在科技飞速发展的今天,人工智能领域的每一次重大突破都如同巨石投入平静湖面,激起千层浪。当地时间 2 月 15 日,马斯克在社交平台 X 上投下了这样一颗 “巨石”,他宣布旗下人工智能公司 xAI 开发的第三代大语言模型 Grok 3,将于北京…...

rem、em、vw区别

在前端开发里&#xff0c;rem、em、vw都是用来设置元素大小的单位&#xff0c;下面就用大白话讲讲它们的区别。 参考标准不一样 rem&#xff1a;就像大家都用同一把“大尺子”来量东西&#xff0c;这把“大尺子”就是网页里根元素&#xff08;也就是 <html> 标签&#…...

最新Apache Hudi 1.0.1源码编译详细教程以及常见问题处理

1.最新Apache Hudi 1.0.1源码编译 2.Flink、Spark、Hive集成Hudi 1.0.1 3.flink streaming写入hudi 目录 1. 版本介绍 2. 安装maven 2.1. 下载maven 2.2. 设置环境变量 2.3. 添加Maven镜像 3. 编译hudi 3.1. 下载hudi源码 3.2. 修改hudi源码 3.3. 修改hudi-1.0.1/po…...

C语言简单练习题

文章目录 练习题一、计算n的阶乘bool类型 二、计算1!2!3!...10!三、计算数组arr中的元素个数二分法查找 四、动态打印字符Sleep()ms延时函数system("cls")清屏函数 五、模拟用户登录strcmp()函数 六、猜数字小游戏产生一个随机数randsrandRAND_MAX时间戳time() 示例 …...

C++ ——static关键字

1、static修饰局部变量---->静态局部变量 特点&#xff1a; &#xff08;1&#xff09;第一次调用时创建&#xff0c;然后第一次调用结束时没有被回收&#xff0c;以后每次调用&#xff0c;都延用上一次调用结束时的值&#xff0c;直到程序结束时&#xff0c;才被回收 &a…...

Jasper AI技术浅析(二):语言模型

Jasper AI 的核心语言模型是基于 OpenAI 的 GPT-4(Generative Pre-trained Transformer 4)构建的。GPT-4 是一种生成式预训练语言模型,利用深度学习技术,特别是 Transformer 架构,来理解和生成自然语言。 1. GPT-4 的基本原理 1.1 Transformer 架构 GPT-4 基于 Transfo…...

QML 部件获得焦点触发的全局槽函数 onActiveFocusItemChanged

在qml的window窗口中&#xff0c;假如添加里许多其他部件&#xff0c;当这些部件改变时&#xff0c;会有一个全局部件焦点改变槽函数触发&#xff0c;就是 onActiveFocusItemChanged 可以通过此槽函数就可以知道当前焦点在哪一个部件上&#xff0c;也可以做一些自动化测试等&…...

【git】工作场景下的 工作区 <-> 暂存区<-> 本地仓库 命令实战 具体案例

&#x1f680; Git 工作区 → 暂存区 → 本地仓库 → 回退实战 Git 的核心流程是&#xff1a; &#x1f449; 工作区&#xff08;Working Directory&#xff09; → git add → 暂存区&#xff08;Staging Area&#xff09; → git commit → 本地仓库&#xff08;Local Repos…...

Python 中从零开始的随机梯度下降

文章目录 一、说明二、了解基础知识的重要性&#xff1a;2.1 什么是梯度下降&#xff1f;2.2 梯度下降的类型&#xff1a; 三、随机梯度下降 &#xff08;SGD&#xff09; 有何不同3.1 随机性的概念&#xff1a;3.2 SGD的优点和缺点&#xff1a; 四、随机梯度下降的分步说明五、…...

期权隐含波动率是什么意思?

财顺小编本文主要介绍期权隐含波动率是什么意思&#xff1f;期权隐含波动率&#xff08;Implied Volatility&#xff09;是根据当前期权市场价格&#xff0c;利用期权定价模型&#xff08;如Black-Scholes模型&#xff09;推导出的关于合约标的理论上的价格波动率。它反映了市场…...

python中使用数据库sqlite3

Python使用sqlite3数据库 python3.x标准库内置了SQLite3 查看sqlite的版本 import sqlite3 sqlite_version sqlite3.sqlite_version print(f"SQLite version: {sqlite_version}") 显示 导入模块连接sqlitte3 import sqlite3 consqlite3.connect("d:/fi…...

JavaScript数组-数组的概念

在JavaScript编程中&#xff0c;数组&#xff08;Array&#xff09;是一种非常重要的数据结构&#xff0c;它允许我们将多个值存储在一个单独的变量中。数组可以包含任意类型的元素&#xff0c;如数字、字符串、对象甚至是其他数组&#xff0c;并提供了丰富的内置方法来操作这些…...

英语---基础词汇库

〇、动词类&#xff08;常见谓语表述&#xff09; 1.show&#xff0c;indicate&#xff0c;find 认为&#xff0c;表明 2.improve,promote,boost,enhance,increase&#xff0c;advocate&#xff0c;strength 改善&#xff0c;提升&#xff0c;促进&#xff0c;增强&#xff0…...

ASCII 与 Unicode:两种字符编码的定义和不同

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 &#x1f4af;前言&#x1f4af;一、ASCII编码详解1.1 ASCII的组成1.2 ASCII的局限性 &#x1f4af;二、Unicode编码详解2.1 Unicode编码方式2.2 Unicode的字符范围 &#x1f4af;三、ASCII与Unicode的…...

Linux相关概念和易错知识点(28)(线程控制、Linux下线程的底层)

目录 1.线程控制 &#xff08;1&#xff09;pthread和thread库 &#xff08;2&#xff09;线程的创建、等待和分离 ①线程创建 ②线程等待 ③线程分离 ④线程替换&#xff08;不可行&#xff09; &#xff08;3&#xff09;线程的终止和取消 ①线程终止 ②线程取消 2…...

lighten() 函数被弃用:替代方案color.scale()或者color.adjust()

在 SCSS (Sass 的一个语法) 中&#xff0c;lighten() 函数用于调整颜色的亮度。然而&#xff0c;随着 Sass 语言的不断发展&#xff0c;一些旧函数被标记为弃用&#xff0c;以鼓励使用更现代、更灵活的 API。lighten() 函数就是其中之一。 1. 弃用通知 当您看到 lighten() is…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...