原理说明
Bios会加载第一扇区到内存中,只有512字节,因此该部分的程序无法做太多的事,因此需要扩展程序,有以下两种方式:
这里选用方式二,因为实现起来相对简单一点。
16位实模式的情况下,寄存器也是16位,详见下图右边的AX BX CX DX
-
8086CPU的寻址范围是1MB
-
确定物理地址的方法:
CPU 访问内存单元时要给出内存单元的地址。
所有内存单元构成的存储空间是一个一维的线性空间。
每一个内存单元都有唯一的地址,叫物理地址。
8086 有 20 位地址总线,可传送 20 位地址,寻址能力是 2^20 = 1 MB
8086 是 16 位结构的 CPU,运算器一次最多处理 16 位的数据,寄存器的最大宽度为 16 位。
在 8086 cpu内部处理的、传输、暂存的地址也是 16 位,寻址能力只有 64 KB -
如何处理地址总线 20 位的寻址能力受限于 16 位地址长度这一问题?
用两个 16 位地址(段地址和偏移地址)合成一个 20 位的物理地址。
地址加法器合成物理地址的方法: 物理地址 = 段地址 ∗ 16 + 偏移地址 -
内存的分段表示法:
内存并没有分段,段的划分来自于CPU
参考链接 :https://blog.csdn.net/AlwaysBeShine/article/details/137412067
实操
初始的start.h如下:
(1)先将寄存器的值置为0
(这里使用AT&T格式的汇编指令,另一种格式是intel格式)
编译后查看反编译文件,可以看到第一个扇区的最后两个字节的值,55和aa,说明第一个扇区中确实有引导代码,因此可以把第一扇区中的内容加载到内存中
(2)接着连接qemu调试一下
-
按F5
-
终端 运行任务 调试准备 继续而不扫描任务输出
- 接着查看寄存器的值
- 按F11可以进行单步操作,观察寄存器的值的变化
通过观察esp寄存器发现,esp寄存器的值不是0x7c00
,经过检查发现是赋值的语句漏写了一个$,如下所示:
重新编译后调试,esp的值就正确了
标签:初始化,01,20,16,物理地址,地址,内存,寄存器,引导 From: https://www.cnblogs.com/kakafa/p/18305789