3.1 地址、section、vstart 浅尝辄止
3.1.1 什么是地址
地址描述各种符号在源程序中的位置,是源代码中各符号偏移文件开头的距离。
编译器的工作就是给各符号编址。
3.1.2 什么是 section
编译器提供的关键字 section 只是为了让程序员在逻辑上将程序划分成几个部分。
3.1.3 什么是 vstart
section 用 vstart= 来修饰后,可以被赋予一个虚拟起始地址。
mbr 用 vstart=0x7c00
来修饰的原因,是开发人员知道 mbr 要被加载器(BIOS)加载到物理地址 0x7c00,mbr 中后续的物理地址都是 0x7c00+。
3.2 CPU 的实模式
3.2.1 CPU 的工作原理
CPU 大体上可以划分为 3 个部分:
- 控制单元。由指令寄存器 IR、指令译码器 ID、操作控制器 OC 组成。
- 存储单元。CPU 内部的 L1、L2缓存及寄存器。
- 运算单元。负责算术运算(加减乘除)和逻辑运算(比较、移位)。
3.2.2 实模式下的寄存器
CPU 中的寄存器大致上分为两大类:
- 对程序员不可见的寄存器。比如全局描述符表寄存器 GDTR、中断描述符表寄存器 IDTR、局部描述符表寄存器 LDTR、任务寄存器 TR、控制寄存器 CR0~3、指令指针寄存器 IP、标志寄存器 flags、调试寄存器 DR0~7。
- 对程序员可见的寄存器。比如段寄存器、通用寄存器。
实模式下,默认用到的寄存器都是 16 位宽的。
CPU 用“段基址:段内偏移地址”的形式访问内存。
段基址在实模式下要乘以 16,在保护模式下只是个选择子,但其作用就是指定一片内存的起始地址。
IP 寄存器是不可见寄存器,CS 寄存器是可见寄存器。
无论是实模式还是保护模式,通用寄存器有 8 个:
- AX
- BX
- CX
- DX
- SI
- DI
- BP
- SP
通用寄存器:
寄存器 | 助记名称 | 功能描述 |
---|---|---|
ax | 累加器 | 常用于算术运算、逻辑运算、保存与外设输入输出的数据 |
bx | 基址寄存器 | 常用于存储内存地址 |
cx | 计数器 | 常用于循环指令中的循环次数 |
dx | 数据寄存器 | 通常情况下只用于保存外设控制器的端口号地址 |
si | 源变址寄存器 | 常用于字符串操作中的数据源地址 |
di | 目的变址寄存器 | 常用于字符串操作中的数据目的地址 |
sp |