8086 存储组织
段
8086 CPU
有20条地址线,可以寻址的空间为$2^{20} = 1MB$- 前
256*4=1K
尽量别修改,这里是中断向量表 - 设计的时候尽量让 段与段之间隔离
debug
默认情况下 四段合一
分段管理
- 物理地址:存储器中的实际地址
- 逻辑地址:采用段地址:偏移地址表示
- 段地址存放在段寄存器中。
1MB
的地址空间最少可以分为16
段,每个段64KB
(段不重叠)1MB
的地址空间最多可以分为65535
段,每段16B
(段不重叠)
逻辑地址转换成物理地址计算方法:
物理地址 = 段地址`* 0x10 + 偏移地址
0B34:01E0(逻辑地址) = 0B34 * 0x10 + 01E0 = B520(物理地址)
段寄存器
- DS:数据段 DS:EA 取数据段中的数据
- CS:代码段 CS:IP 取下一条指令
- SS:堆栈段 SS:SP 栈顶指针数据
- ES:附加段
386后扩展:
- FS:windows中指向线程环境块teb
- GS
段寄存器赋值
数据访问使用的是DS段
BP访问使用的是SS段
错误的做法:
mov dx,3000
正确的做法:
mov ax,3000
mov dx,ax
段超越
没有段超越:默认使用 ds作为基址
mov byte ptr[0] ,4 ->ds+0
段超越: 使用es作为基址
es:
mov byte ptr[0] ,4 ->es+0
理论上 段超越可以使用mov byte ptr es:[0], 4
来设置但是,debug
不支持