从0创建一个OS (七) 汇编中的段
本节将学习16bit模式的段结构
关键字:段
目标:学习如何在16bit模式下寻址
如果你对段已经很熟悉了,那么你可以跳过本节.
理论基础
在从0创建一个OS (四) 电脑存储的组织形式一节中我们利用org完成了对booot sector的全局基址定义,那是我们第一次在本系列博客中接触到段的概念.
段寄存器中存储的为段地址,从第一代8086机问世以来,之后每一代计算机的基础段寄存器一直没有变化,有以下4个:
cs: code segment 代码段
ds: data segment 数据段
ss: stack segment 栈段
es: extented segment 扩展段
其中ds常和es搭配使用,用于复制字符串.
这4个寄存器无法直接使用类似于mov cs, 0xcd的语句赋值,必须借助于中间寄存器,如:
注意!这4个寄存器在隐式地被CPU调用,用来寻址,所以在改变这4个寄存器的值之前,你必须明白自己在做什么,会不会影响到CPU接下来的寻址.
16bit模式下的物理地址计算方法如下:
物
理
地
址
=
段
地
址
<
<
4
+
偏
移
地
址
物理地址 = 段地址 << 4 + 偏移地址
物理地址=段地址<<4+偏移地址
例如,假设当前的ds的值为0x4d,那么[x20]表示的物理地址为:
0x4d0 + 0x20 = 0x4f0
至于为什么要将段地址左移4位呢?本文不做解释,可以给大家提供一个线索,第一代8086的数据总线有20位.
源码
废话不多说,上代码
注意,这次我们并没有使用
[org 0x7c00]
文件名: boot_sect_segmentation.asm
实验结果
总结
发现尝试2和尝试4打印成功,即隐式调用ds和显式调用es成功,说明CPU在寻址时默认使用的段寄存器为DS.
__EOF__

本文链接:https://www.cnblogs.com/haiyonghao/p/14623201.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律