寄存器和字长
字长:寄存器的存储的数据宽度
字节:8位
字:16位,2个字节
双字:32位,4个字节
4个字:64位,8个字节
内存访问和字节序
内存访问:包括地址,读或者写,数据,字长控制
字长控制:单次读取或卸任8位,16位,32位或64位
低端字节序:高字节位于高地址部分,低字节位于低地址部分
INTEL8086处理器
16位处理器,是整个INTEL32位架构处理器(IA-32)的开山鼻祖。以后的处理器设计,必须保证兼容性
-
寄存器
- 8个通用寄存器
- 4个段寄存器
CS,DS,ES,SS
当需要在程序中使用两个数据段时,DS指向一个,ES指向一个,默认使用DS - 1个IP指令指针寄存器
- 8个通用寄存器
-
为什么引入分段机制
程序必然有代码要要操作的数据,当指令中混杂了数据指令流就不能正常的运行,所以指令和数据要分开存放,分别存放在代码段和数据段,但是如果要使用指令中指定的内存地址当成物理地址(相对于内存起始处的绝对地址)定位数据的位置,因为程序被加载的位置是不固定的,如果使用绝对地址去访问数据会出现访问到错误数据的情况。所以出现了逻辑地址,指令中指定的内存地址是段内偏移地址,处理器提供了两个段地址寄存器CS(代码段寄存器)和DS(数据段寄存器),当指令中出现地址时,会把这个地址当作偏移地址,和DS中的地址相加得到真正的物理地址来访问数据。所以这就保证了,即使代码段和数据段在内存的位置发生了变化,只要把他们的段地址送到CS和DS,程序就能够正常运行。所以程序被加载后,如何正确的设置CS和DS才是重点
-
逻辑地址
- 段地址:段的起始地址
- 逻辑地址:段地址:偏移地址
-
8086的内存分段机制
8086提供了20跟地址线,可以访问1M的内存,但是CS和DS都是16位的,偏移地址也是16位的,如何生成20位的物理地址?
答:段地址起始于能够被16整除的物理内存地址,将这样的内存地址除以16(右移4位)就得到逻辑段地址,将此地址传送到段寄存器,访问内存时,将段寄存器中的逻辑段地址乘以16(左移4位),得到段的起始物理地址(段地址),由于段地址都是16的倍数,所以被称为16字节对齐的。