汇编语言_ch2_1寄存器与内存

1. cpu的组成

如图中, 左边部分表示 CPU的组成:

  1. 运算器, 主要指ALU 算术逻辑单元,负责信息处理‘
  2. 寄存器, cpu 工作过程中信息存储的地方, 注意, 寄存器是存在CPU内部,用于存储数据的单元, 与其他存储设备不同,它是处于CPU内部;
  3. 控制器: 协调各种器件进行工作;

还有各种内部总线, 实现CPU 内的各个器件之间的联系;

汇编语言_ch2_1寄存器与内存_第1张图片

CPU 内部组成结构

1.1 寄存器是CPU内部的信息存储单元

:8086CPU有14个寄存器:
; 通用寄存器:AX、BX、CX、DX
; 变址寄存器:SI、DI
; 指针寄存器:SP、BP
; 指令指针寄存器: IP
; 段寄存器:CS、SS、DS、ES
; 标志寄存器:PSW
:共性
; 8086CPU所有的寄存器都是16位的,
可以存放两个字节。

1. 2 字的概念

8086是16位CPU
; 8086的字长(word size)为16bit

一个字 word = 2 个字节 = 2byte = 16 位
一个字(word)可以存在一个16位寄存器中:
; 这个字的高位字节存在这个寄存器的高8位寄存器
; 这个字的低位字节存在这个寄存器的低8位寄存器

2. 确定物理地址的方法

段地址 × 16 + 偏移地址 = 物理地址

物理地址 是 20位的数据,
而段地址 和 偏移地址都是 16 位的数据,使用十六进制表示 即 4 位; 、

因为 16进制的每一位代表了二进制中的4位,
4位十六进制代表的 便是 16 位的二进制数;

2.1 段地址和偏移地址的由来

那么为什么要用 两个 16 位的数据 通过组合 , 表示出一个 20位的数据呢

硬件限制

  1. 当时的8086 的 地址总线是20 位, 即可以传送20位的地址数据, 寻址能力 2 20 2^{20} 220 =1M ,

  2. 但是, 8086 CPU中的 寄存器却只有16位, 由于地址数据最初是通过从寄存器取出来,经过位址加法器 ,然后 放到地址总线上的;

段地址: 所以将寄存器中16 位的数据左移 4位, 得到的便是一个 20位的数据,
此时得到的20 位数据便是一个段的起始地址, 所以称为段地址;

偏移地址: 而从该段的起始地址开始, 往后寻找该段内的地址单元,便是通过在该内偏移找到的;

汇编语言_ch2_1寄存器与内存_第2张图片

2.2 物理地址的工作原理

汇编语言_ch2_1寄存器与内存_第3张图片
而同一个物理地址 可以由 不同的段地址 和 偏移地址 实现
汇编语言_ch2_1寄存器与内存_第4张图片

3. 内存的分段表示法

cpu 采用的是分段的方式 管理计算机中的内存, 将整个内存分成若干个段;

8086 CPU 中使用:
一个内存地址 是用 5 位的 十六进制表示的, (即 20 位的 二进制数, 2 20 2^{20} 220 = 1MB ),

段地址 × 16 + 偏移地址 = 物理地址
此处的 段地址 便是 分段以后的地址, 而在 某一段中, 在进行重新定位的时候, 便是 用偏移地址, 精准的定位到该段内的地址;

3.1 段的概念

内存本身没有分段, 段的划分是CPU 自己区分的;

  • 段地址: 段地址表示该段在内存中的起始地址,取该起始地址的高4位表示。

由于段地址本身取的是 起始地址的高四位表示的, 所以才需要将该段地址 再往左移 1位, 才得到的是真正的该段的起始地址

将该段地址左移1位 = 等价于 16进制的段地址左移1位 = 等价于对应的二进制左移4 位 = 等价于将数值 × 16,

段地址 × 16 = 必然是16的倍数, 所以一个段的起始地址也一定是16的倍数。
段地址 × 16, 代表二进制下左移 4 位, 十六进制下便是左移 1位

  • 偏移地址: 偏移地址则决定了 在该段中具体的位置, 偏移地址是由4位16进制表示的。 也即16为二进制数, 16 位地址的寻址能力为 2 16 2^{16} 216 = 64K, 所以一个段的长度最大为 64 K。

以下举例说明, 段地址和 偏移地址:
汇编语言_ch2_1寄存器与内存_第5张图片

  • 比如下图中, 起始地址为 10000H, 取出该十六进制的前4位, 则表示成段地址便是 1000H,注意,图中的该段划分方式是 该段是从 10000H - 100FFH

  • 该例子中的,段内的偏移量便是从 00HFFH, 大小为 100H

3.2 同一段内存不同的表示方式

汇编语言_ch2_1寄存器与内存_第6张图片

你可能感兴趣的:(#,汇编,linux)