4 位置位置位置
/LearnNote 74

内存模式

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):附加段

内存管理单位

名称

大小(字节)

意义

段落(paragraph)

16

10H

段对齐的基本单位

页(page)

256

100H

内存分页的基本单位

段(segement)

65,536

10000H

实模式下的最大段大小

如何实现实模式段模型(知道目前在使用哪个段和怎么移动段)

将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

4 位置位置位置
http://47.100.250.251:8091/archives/wei-ming-ming-wen-zhang-da9OImLa
作者
Administrator
发布于
更新于
许可