1.11 ~ 2.6
《汇编语言(第3版)》1.11 ~ 2.6、《零基础入门学习汇编语言》P5 ~ 8
1.11 内存地址空间(概述)
一个 CPU 的地址线宽度为 10,那么可以寻址 1024 个内存单元,这 1024 个可寻到的内存单元就构成这个 CPU 的内存地址空间。
1.13 接口卡
CPU 对外部设备不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。
1.14 各类存储器芯片
- 从读写属性上分两类
- 随机存储器(RAM)
- 只读存储器(ROM)
- 从功能和连接上分类
- 随机存储器 RAM
- 装有 BIOS 的 ROM
- 接口卡上的 RAM
1.15 内存地址空间
最终运行程序的是 CPU,我们用汇编编程的时候,必须要从 CPU 角度考虑问题(学习汇编的核心思维)。
第二章 寄存器(CPU工作原理)
一个典型的 CPU 由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
8086 CPU 有 14 个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PWS。
2.1 通用寄存器
8086 CPU 所有的寄存器都是 16 位的,可以存放两个字节。
AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。
一个 16 位寄存器所能存储的数据的最大值为 $ 2^{16}-1 $
8086 上一代 CPU 中的寄存器都是 8 位的,所以为保证兼容性,这四个寄存器都可以分为两个独立的 8 位寄存器使用:AX 可以分为 AH 和 AL;BX 可以分为 BH 和 BL,以此类推。
2.2 字在寄存器中的存储
一个字可以存在一个 16 位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高 8 位寄存器和低 8 位寄存器中。
2.3 几条汇编指令
汇编指令不区分大小写
汇编指令 | 控制 CPU 完成的操作 | 用高级语言的语法描述 |
---|---|---|
mov ax,18 | 将 18 送入 AX | AH = 18 |
mov ah,78 | 将 78 送入 AH | AH = 78 |
add ax,8 | 将寄存器 AX 中的数值加上 8 | AX = AX + 8 |
mov ax,bx | 将寄存器 BX 中的数据送入寄存器 AX | AX = BX |
add ax,bx | 将 AX,BX 中的内容相加,结果存在 AX 中 | AX = AX + BX |
CPU 执行下表中的程序段的每条指令后,对寄存器中的数据进行的改变。
问1:原 AX 中的值:0000H,原 BX 中的值:0000H)
程序段中的指令 | 指令执行后 AX 中的数据 | 指令执行后 BX 中的数据 |
---|---|---|
mov ax,4E20H | 4E20H | 0000H |
add ax,1406H | 6226H | 0000H |
mov bx,2000H | 6226H | 2000H |
add ax,bx | 8226H | 2000H |
mov bx,ax | 8226H | 8226H |
add ax,bx | ? | 8226H |
答案:044CH(原本 8226H+8226H=1044CH,但是 ax 只放得下两个字所以是 044CH)
问2:原 AX 中的值:0040H
程序段中的指令 | 指令执行后 AX 中的数据 |
---|---|
add al,85H | 00C5H |
add al,93H | ? |
答案:0058H(因为 add 的地方是 al 八位寄存器,所以原本属于 ax 高位 ah 的 01 进位值会被丢失。这里的丢失,指的是进位值不能在 8 位寄存器中保存,但是 CPU 并不是真的丢弃这个进位值)
2.4 物理地址
CPU 访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,这个唯一的地址称为物理地址。
2.5 16 位结构的 CPU
概括的讲,16 位结构描述了一个 CPU 具有以下几个方面特征
- 运算器一次最多可以处理 16 位的数据。
- 寄存器的最大宽度为 16 位。
- 寄存器和运算器之间的通路是 16 位的。
2.6 8086 CPU 给出物理地址的方法
8086 有 20 位地址总线,可传送 20 位地址,寻址能力为 1M( $ 2^{20}=1MB $ )
8086 内部为 16 位结构,它只能传送 16 位的地址,表现出的寻址能力就只有64K( $ 2^{16}=64KB $ )
8086 CPU 采用一种在内部用两个 16 位地址合成的方法来形成一个 20 位的物理地址
地址加法器合成物理地址的方法:物理地址 = 段地址 × 16 + 偏移地址
“段地址 × 16”有一个更为常用的说法就是数据左移 4 位(二进制位)。
移位位数 | 二进制 | 十六进制 | 十进制 |
---|---|---|---|
0 | 10B | 2H | 2 |
1 | 100B | 4H | 4 |
2 | 1000B | 8H | 8 |
3 | 10000B | 10H | 16 |
4 | 100000B | 20H | 32 |
- 通过观察上表(移位次数和各种形式数据的关系)得出
- 一个数据的二进制形式左移 1 位,相当于该数据乘以 2;
- 一个数据的二进制形式左移 N 位,相当于该数据乘以 $ 2^N $
- 地址加法器完成段地址 × 16 的运算即以二进制形式存放的段地址左移 4 位。
- 进一步思考可得
- 一个数据的十六进制形式左移 1 位,相当于乘以 16;
- 一个数据的十进制形式左移 1 位,相当于乘以 10;
- 一个数据的 X 进制形式左移 1 位,相当于乘以 X。