[手写OS]动手实现一个OS 之X86实模式下的汇编开发
[手写OS]动手实现一个OS 之X86实模式下的汇编开发
x86实模式下 汇编开发是一个 intel x86实模式中的汇编程序开发类型。它涉及操纵几个16位处理器寄存器,并仅处理内存中的物理地址(与受保护模式相对)。
这种类型的编程中最广为人知的应用就是1980年代编写的DOS磁盘操作程序。
而所有现代的X86操作系统都是使用的保护模式,但是嘞,当计算机启动的时候,肯定不能是以保护模式启动的,通过实模式启动,并负责切换到保护模式,而这个从实模式切换到保护模式的这个过程,那就必须在实模式下运行。
寄存器
每个寄存器都专门用于某个任务,并且如果使用正确的寄存器,则处理该任务的操作通常会更有效地运行。
在实模式下的寄存器包括:
- 数据寄存器:
- AX,累加寄存器
- BX,基址寄存器
- CX,程序计数寄存器
- DX,数据寄存器
- 地址寄存器:
- SI,源地址寄存器
- DI,目的地址寄存器
- SP,栈顶指针寄存器
- BP,栈底指针寄存器
每一个数据寄存器都可以分为高八位寄存器和低八位寄存器,在一个16位寄存器可以一次解决8位数据,并且可以把这8位视为一个寄存器:例如,在AX寄存器中可分为高八位AH寄存器和低八位AL寄存器
每个都可以通过修改后缀的方式:将 X 扩展为 H 和 L,用来拆分出两个寄存器
总的来说,数据寄存器和地址寄存器统称为 通用寄存器
除此之外,通用寄存器还有如下:
- 段寄存器
- CS,代码段寄存器
- DS,数据段寄存器
- ES,特殊段寄存器
- FS,其他特殊段寄存器 (在Intel8086之前没有)
- GS,另一其他特殊段寄存器 (在Intel8086之前没有)
- SS,堆栈段寄存器
- 其他寄存器
- IP,指令指针寄存器
- FLAGS,标志寄存器
IP 寄存器指向程序中 处理器当前正在执行的代码位置,程序员不可以直接访问这个寄存器
FLAGS寄存器储存当前处理器执行的状态,这个寄存器中的每一位都是一个标志,每个标志都可以是1或0,设置或未设置,主要的标志含义为:携带Carry,溢出Overflow,零值Zero,单步执行Single Step
X86的体系结构中经常使用标志进行比较。比如两个寄存器 进行比较后如果有差别会拉高某个标志位,然后指令检查对应的标志位,如果发现这个标志位被拉高了就跳转
cmp ax,bx
jne 欲跳转的某个Label;
操作码助记符
在实模式中,允许的操作码如下:
aaa, aad, aam, aas, adc, add, and, call, cbw, clc, cld, cli, cmc, cmp, cmpsb, cmpsw, cwd, daa, das, dec, div, esc, hlt, idiv, imul, in, inc, int, into, iret, ja, jae, jb, jbe, jc, jcxz, je, jg, jge, jl, jle, jmp, jna, jnae, jnb, jnbe, jnc, jne, jng, jnge, jnl, jnle, jno, jnp, jns, jnz, jo, jp, jpe, jpo, js, jz, lahf, lds, lea, les, lock, lodsb, lodsw, loop, loope, loopne, loopnz, loopz, mov, movsb, movsw, mul, neg, nop, not, or, out, pop, popf, push, push, puchf, rcl, rcr, rep, repe, repne, repnz, repz, ret, rol, ror, sahf, sal, sar, sbb, scasb, scasw, shl, shr, stc, std, sti, stosb, stosw, sub, test, wait, xchg, xlat, xor
还有一些其他的操作码没有具体的操作码助记符,没有被记录进来。比如“0x0F”在8086处理器中被解释为POP CS,x86家族其他处理器相比于早期处理器可能不会解释没有被记录的操作码。因此在使用没有文档解释的操作码时,你写的程序可能在之后的处理器上用不了
实模式的寻址
由于IA32和Intel64处理器的体系架构和其他处理器的架构不太一样,其他架构的可能线性地址空间就实模式地址空间,而IA32和Intel64处理器架构的还得分段。
分段模式主要是将线性地址分为两个部分: 段 + 偏移量
段地址指向一个64k的地址区间,从起始位置到指定位置的偏移量。要转换回线性地址,段地址向左移位4位,然后加上偏移量。
段寄存器:偏移寄存器 例如 DS:DX
段寄存器和通用寄存器的一些特殊组合指向重要地址
CS:IP 用来指向处理器获取下一字节代码的地址
SS:SP 指向的是入栈的最后一项的位置(一般表示栈顶)
DS:SI 通常用于指向即将被复制到 ES:DI 的数据
实模式下的PC内存分布
| 开始 | 结束 | 大小 | 描述 | 类型 |
|---|---|---|---|---|
| 0x00000 | 0x003FF | 1kb | 实模式IVT(中断向量表) | 实模式下不可用 |
| 0x00400 | 0x004FF | 256b | BDA (BIOS数据区) | 实模式下不可用 |
| 0x00500 | 0x07BFF | 约30kb | 常规内存 | 可用内存 |
| 0x07C00 | 0x07DFF | 512kb | 操作系统引导区 | 可用内存 |
| 0x07E00 | 0x7FFFF | 480.5kb | 常规内存 | 可用内存 |
| 0x80000 | 0x9FFFF | 128kb | EBDA (BIOS扩展数据区) | EBDA使用 |
| 0xA0000 | 0xBFFFF | 128kb | 视频显示存储 | 硬件映射 |
| 0xC0000 | 0xC7FFF | 32kb | 视频BIOS | |
| 0xC8000 | 0xEFFFF | 160kb | BIOS扩展 | |
| 0xF0000 | 0xFFFFF | 64kb | 主板BIOS |
相关文章:
[手写OS]动手实现一个OS 之X86实模式下的汇编开发
[手写OS]动手实现一个OS 之X86实模式下的汇编开发 x86实模式下 汇编开发是一个 intel x86实模式中的汇编程序开发类型。它涉及操纵几个16位处理器寄存器,并仅处理内存中的物理地址(与受保护模式相对)。 这种类型的编程中最广为人知的应用就…...
【Linux内核二】常用的网络丢包错包debug工具介绍
目录 ifconfig Ifconfig输出各字段简述 txqueuelen RX和TX的errors指哪些错误 dropped与overruns的区别 常用ifconfig配置命令 显示网卡信息 启动关闭指定网卡 配置和删除ip地址 修改MAC地址 启用和关闭ARP协议 设置最大传输单元 设置网卡的promiscuous模式 设置…...
qt控件增加渐变色效果
ui->returnBtn->setStyleSheet("color: rgb(0, 0, 0);""background:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, ""stop:0 #5f5f5f, stop:0.5 #ffffff, stop:0.98 #5f5f5f);""border:none;");效果如下图: …...
【node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 最全面有效的解决方案】
执行nodejs文件错误: 这个错误提示通常是由于你的系统无法识别 "node" 命令,可能是由于你没有正确地安装或配置 Node.js 环境变量。 问题描述 原因分析: 可能原因包括: 1.Node.js未正确安…...
打怪升级之字符串的分界符与字符串替换
流的字符串分界符 在C的iostream中,有流的字符串分界符: " “和”"都代表简单的分隔。 因此,使用流来做字符串分隔的话,有一个比较简单的方案就是将原定义的分隔符通过替换的方式变成流的分隔符。然后再录入流中就能…...
载荷台子使用方式
载荷自动测量台子使用方法 电源开关旋转到1,开启电源开启台子微机开关,开启电脑(winxp)开启台子载荷开关,启动载荷台子点击电脑动标图标,开启软件放入载荷,弹性体向上,载荷台子压头压…...
1005 继续(3n + 1)猜想
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候,我们需要计算 3、5、8、4、2、1&a…...
VMware15配置NAT模式联通网络
最近为了测试C# 开发的桌面应用程序悬浮球的兼容性,在虚拟机上安装了win7系统和xp系统,之前也安装过黑苹果系统,但是win系统倒是第一次安装,在win7系统联网的时候,踩了一些坑,整理纪录一下。 设置主物理机配…...
doPost的实际使用
目录 前言 一、doPost是什么? 二、使用步骤 1.doPost的请求方法 2.需要引入依赖 总结 前言 本章主要记录一下doPost的请求公用方法的使用。 一、doPost是什么? 它其实就是一个http的post请求方式。 二、使用步骤 1.doPost的请求方法 当我们系…...
2017年MathorCup数学建模A题流程工业的智能制造解题全过程文档及程序
2017年第七届MathorCup高校数学建模挑战赛 A题 流程工业的智能制造 原题再现: “中国制造 2025”是我国制造业升级的国家大战略。其技术核心是智能制造,智能化程度相当于“德国工业 4.0”水平。“中国制造 2025”的重点领域既包含重大装备的制造业&…...
HNU-电子测试平台与工具2-数模转换
数模转换实验 计科XXXX wolf 工程文件我也一并上传了 D级任务 一.实验任务 对74194进行仿真验证,掌握Quartus仿真的基本原则和常规步骤,记录移位寄存器的数据读写,并描述仿真波形,分析结果。 二.实验过程 1.电路连接 2.功能…...
CentOS7安装Telnet客户端和服务端和使用方式
在执行telnet时会提示命令不存在。Telnet服务的配置步骤如下:一、检测是否安装telnet软件包(通常要两个)1、telnet-client (或 telnet),这个软件包提供的是 telnet 客户端程序;2、telnet-server 软件包,这个才是真正的…...
脂肪毒性的新兴调节剂——肠道微生物组
谷禾健康 肠道微生物组与脂质代谢:超越关联 脂质在细胞信号转导中起着至关重要的作用,有助于细胞膜的结构完整性,并调节能量代谢。 肠道微生物组通过从头生物合成和对宿主和膳食底物的修饰产生了大量的小分子。 最近的研究表明,由…...
【JavaSE系列】 第九节 —— 多态那些事儿
文章目录 前言 一、多态的概念 二、向上转型和向下转型 2.1 向上转型 2.2 什么是向上转型 2.3 三种常见的向上转型 2.3.1 直接赋值 2.3.2 作为方法的参数 2.3.3 作为方法的返回值 2.4 向下转型(这个了解即可) 三、方法重写 3.1 方法重写的…...
ego微商小程序项目-测试步骤
文章目录 1. 需求分析和评审2. 编写测试计划和测试方案2.1 ego小程序测试计划2.1.1 项目简介2.1.2 项目任务2.1.3 项目风险2.1.4 测试方案2.1.5 测试实施2.1.6 测试管理2.1.7 附录资料3. 编写测试用例和评审3.1 功能测试用例设计3.1.1 总-整体把控3.1.2 分- 拆分细化3.2 测试用…...
华为OD机试用Python实现 -【报数游戏】2023Q1 A卷
华为OD机试题 本篇题目:报数游戏题目输入输出示例 1输入输出示例 2输入输出Code代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解...
Plsql使用
登录登录system用户,初始有两个用户sys和system,密码是自己安装oracle数据库时写的,数据库选择orcl创建用户点击user,右键新增填写权限关于3个基本去权限介绍: connect : 基本操作表的权限,比如增删改查、视图创建等 r…...
小丑改造计划之四线程控制
1.线程有哪些优点,缺点? 1.优点: 创建线程的代价比较小 线程切换比进程的切换,操作系统要做的事少 线程比进程占用的资源要少 缺点: 子线程可能会影响主线程,健壮性不如进程 编写多线程比单线程难ÿ…...
Spring注册Bean的几种方式
通过XML配置注册Bean spring-config.xml <!--方式一:声明自定义的bean,没有设置id,id默认为全类型#编号--><bean id"cat" class"com.rzg.entity.Cat"/><bean class"com.rzg.entity.Cat"/>public class SpringApp…...
Egg:使用joi进行参数校验以及注册接口小demo
目录 前言: 准备工作: 前端代码: 后端目录截图: 1.获取参数 2.校验参数 3.查询数据库中是否已经存在该用户 4.用户入库 5.测试一哈 添加用户成功 同样的用户名再注册一遍 编辑总结: 前言: 在阅…...
Nunchaku-flux-1-dev一键部署教程:Ubuntu20.04环境配置
Nunchaku-flux-1-dev一键部署教程:Ubuntu20.04环境配置 1. 开篇:为什么选择这个部署方案 如果你刚接触Linux环境下的模型部署,可能会觉得配置各种依赖和环境变量很头疼。Nunchaku-flux-1-dev作为一个功能强大的模型,其实在Ubunt…...
Codesys实战排障手记:从证书过期到RTC时钟校准
1. 当Codesys突然弹出证书过期警告时 那天我正在客户现场调试禾川HCQ1系列PLC,刚打开Codesys V3.5开发环境,一个鲜红的证书过期警告就弹了出来。这种突如其来的报错让现场气氛瞬间紧张——产线等着调试,设备等着联调,而系统却在关…...
socat-windows:开发者与管理员必备的跨平台数据转发工具
socat-windows:开发者与管理员必备的跨平台数据转发工具 【免费下载链接】socat-windows unofficial windows build of socat http://www.dest-unreach.org/socat/ 项目地址: https://gitcode.com/gh_mirrors/so/socat-windows 在网络调试与数据传输领域&…...
如何快速优化Windows掌机:终极体感控制完整指南
如何快速优化Windows掌机:终极体感控制完整指南 【免费下载链接】HandheldCompanion ControllerService 项目地址: https://gitcode.com/gh_mirrors/ha/HandheldCompanion 还在为Windows掌机操作不够精准、游戏兼容性差、配置切换麻烦而烦恼吗?Ha…...
Z-Image-Turbo镜像效果展示:孙珍妮LoRA在不同画幅(1:1/4:3/9:16)表现
Z-Image-Turbo镜像效果展示:孙珍妮LoRA在不同画幅(1:1/4:3/9:16)表现 1. 引言:当AI遇见明星肖像生成 你是否曾经想过,用AI技术生成自己喜欢的明星肖像?今天我们要展示的Z-Image-Turbo镜像,正是…...
文墨共鸣大模型安装包依赖分析与环境冲突解决
文墨共鸣大模型安装包依赖分析与环境冲突解决 你是不是也遇到过这种情况:拿到一个项目,兴冲冲地运行 pip install -r requirements.txt,结果屏幕上开始疯狂报错,各种版本不兼容、找不到模块、编译失败的信息轮番轰炸。折腾了几个…...
Polars 2.0清洗故障率下降92%的关键:schema-on-read预检 + 自定义error-handling策略(金融级数据治理标准)
第一章:Polars 2.0清洗故障率下降92%的关键洞察Polars 2.0 通过重构执行引擎与引入零拷贝数据验证机制,显著降低了ETL清洗阶段的运行时异常。核心改进在于将传统基于Python对象的列类型推断,替换为编译期静态Schema校验,并在LazyF…...
Apifox 实战:从实体类到请求参数的自动化转换技巧
1. 为什么需要实体类到请求参数的自动化转换 每次对接新接口时最头疼的事情是什么?对我来说就是手动编写那一大堆请求参数。上周接手一个用户管理模块,光是用户信息更新接口就有23个字段,如果每个字段都要手动填写参数名、类型、说明…...
从隔离到互联:工业现场中耐达讯自动化CC-Link IE转Modbus RTU实战指南
在工业自动化领域中,不同协议设备间的通信壁垒正成为智能制造的核心挑战之一。耐达讯自动化的CC-Link IE转Modbus RTU专用网关,通过硬件级协议转换技术,高效实现CC-Link IE高速以太网与Modbus RTU串口设备的无缝对接,帮助企业快速…...
如何通过Superalgos教育模块快速掌握算法交易:新手入门完整指南
如何通过Superalgos教育模块快速掌握算法交易:新手入门完整指南 【免费下载链接】Superalgos Superalgos/Superalgos: 是一个开源的分布式社交网络分析和数据挖掘平台。适合对大数据分析、机器学习、区块链以及分布式系统有兴趣的开发者。 项目地址: https://gitc…...
