内存模式
x86cpu 存在3种主要内存寻址方式(也称为内存模式):
实模式平面模型
8080 cpu
8位CPU:一次处理8位数据
16根地址线:可寻址64KB内存(2^16),0-0FFFFH
主要使用CP/M 80 操作系统
运行时:

内存顶部:CP/M操作系统
中间:可用内存
底部:0100H - 程序代码开始
最底部:0000H-00FFH - PSP(程序段前缀)
实模式段模型
8086 cpu
16位CPU:一次处理16位数据
20根地址线:可寻址16*64KB=1MB内存(2^(16+4))) 0-0FFFFFH
8086向后兼容,在1m内存中为8080开辟只有64k的段,该过程使用段寄存器实现
CS (Code Segment):代码段
DS (Data Segment):数据段
SS (Stack Segment):栈段
ES (Extra Segment):附加段

内存管理单位
如何实现实模式段模型(知道目前在使用哪个段和怎么移动段)
将1MB以每16字节的间隔分开得到64K个段落,每个段落都有自己的编号(比如0h是段落1,10h是段落2,20h是段落3……)
在16位cpu中(8086,8088),如何记住20位地址.答案是使用两个寄存器,段寄存器1来记录位于哪个段,偏移寄存器2记录该字节到段落开始的偏移
就像:
0001:0019
该形式表示该地址是位于0001H段地址,偏移为19H的字节,因为每个段落的单位是16字节,所以实际地址用16进制表示应该左移1位,完整地址就是00029H
当然还可以有以下几种表示方式:
0000:0029
0002:0009
这就是实模式段地址寻址的方式
再回头看看段寄存器(segment registers)
CS (Code Segment):包含当前执行指令的代码所在段
DS (Data Segment):变量和其它数据所在段
SS (Stack Segment):堆栈所在段
ES (Extra Segment):附加段,在386以及之后的x86 cpu中还有FS,GS
通用寄存器
有8位半寄存器,16位通用寄存器,32位和64位扩展寄存器
💡
x86 系列都是通过扩展老式cpu中的寄存器来增加寄存器容量
16位通用寄存器
AX,BX,CX,DX,BP,SI,DI,SP (存在于8086,8088,80286 cpu)
扩展为32位后在名字前加上E
SI,DI,BP,SP扩展:
在32位cpu中你仍可以用SI访问ESI的低16位(但没有直接的办法得到高16位)
半寄存器
EAX,EBX,ECX,EDX就要稍微特别一点,他们的低16位还被分为2个8位
EAX→AX→AH/AL