8086处理器是英特尔(Intel)在1978年推出的一款16位微处理器,它是x86架构以及计算机科技发展史的重要里程碑。如今我们学习x86汇编绕不开8086处理器。
通用寄存器
8086处理器有八个十六位通用寄存器:AX BX CX DX SI DI BP SP 。
AX BX CX DX 四个寄存器又可分为八个八位处理器。以AX为例。AX的高八位是寄存器AH,低八位是寄存器AL。
- AX:16位寄存器,可以分为两个8位寄存器,高八位是AH,低八位是AL。
- BX:16位寄存器,可以分为两个8位寄存器,高八位是BH,低八位是BL。
- CX:16位寄存器,可以分为两个8位寄存器,高八位是CH,低八位是CL。
- DX:16位寄存器,可以分为两个8位寄存器,高八位是DH,低八位是DL。
当我们修改16位寄存器中的8位寄存器时,整个16位寄存器的值都会改变。例如,当我们将AX寄存器的AL部分从0x12更改为0x34,那么AX寄存器的值将从0x0012变为0x00l。同理,我们更改AX寄存器时AL与AH也会发生相应改变。
字节序
内存由字节单元组成,8086有16根数据线,所以在写入内存时cpu会将16位数据拆成两个8位。当我们写入一个字时,如果低字节写入内存的低地址单元。高字节写入内存的高地址单元。那么,我们称为小端字节序。如果低字节写入内存的高地址单元。高字节写入内存的低地址单元。那么,我们称为大端字节序。
读取时也是如此,如果读取一个16位数据,两个内存单元的数据也会被依次取出,在数据线上合并。我们学习的8086处理器采用的是小端字节序
内存访问
8086处理器有20根地址线,可以寻址1,048,576(2的20次方)个不同的内存单元。每个内存位置可以存储一字节,1MB = 1024KB,每个KB等于1024字节。所以,8086处理器可以访问大约1MB的内存空间。
8086处理器使用分段内存模型,这意味着内存被分为四个段,数据段,代码段,堆栈段与附加段。每个段可以是64KB大小。段由段寄存器指定其基地址。
- 代码段(Code Segment)由CS(Code Segment)寄存器指定。
- 数据段(Data Segment)由DS(Data Segment)寄存器指定。
- 堆栈段(Stack Segment)由SS(Stack Segment)寄存器指定。
- 附加段(Extra Segment)由ES(Extra Segment)寄存器指定。
8086处理器的地址线为20位,但段寄存器为16位,那么段寄存器如何存储地址呢?
在存储时寄存器会将地址右移四位存储,如地址 0x55AA0(0x表示数字为16进制)会存储为 0x55AA。所以并非所有物理地址都可作为段地址,段地址的低四位需要为0。为了访问任意内存地址,除了段寄存器提供的基址外,还需要一个16位的偏移量。这个偏移量通常由指令或数据操作的一部分提供。对于代码段,8086处理器单独使用一个16位寄存器 IP 存储下一条指令的偏移地址。
在内存访问中,我们通过将段寄存器的值左移4位(相当于乘以16或2的4次方)来扩展到20位,然后加上16位的偏移量来计算的。
公式: 物理地址=(段基址<<4)+偏移量
假设CS寄存器的值为0x1234,IP寄存器的值为0x5678,那么当前指令的物理地址将是: 物理地址 = ( 0x1234<<4 ) + 0x5678 = 0x179B6。
地址空间分配
8086处理器有20根地址线,可以访问从 0x00000~0xFFFFF 的内存单元,从地址上看这些内存单元是连续的,而实际上它们并不是物理上的整体。
通常情况下,地址范围为 00000~9FFFF 是我们所说的内存,A0000~EFFFF 映射的是外设的接口,处理器通过向这块内存读取或写入完成对外设的访问。F0000~FFFFF 则是RAM上面烧录着BIOS。BIOS负责初始化计算机的硬件组件,如CPU、内存、硬盘、显卡等,并提供一些基本的输入输出功能。
标签:8086,16,认识,地址,内存,寄存器,处理器 From: https://blog.csdn.net/2301_80926085/article/details/139055545