CPU、存储器与总线
存储器划分为多个存储单元,一个存储单元为1Byte = 8 bit
CPU进行数据读写,需要与外部器件进行的信息交互,交互通过总线进行,可在逻辑上分为三类:
地址总线:存储单元的地址;即确认了是哪个器件(CPU将所有器件的存储器视为一个逻辑上的存储器,不同地址可以代表不同的器件),是器件存储器中的哪个地址
控制总线:器件的选择,传输是读取命令还是写入命令
数据总线:传输读取/写入的数据

地址总线与内存分段
地址总线用于传输存储单元的地址,地址总线能传输多少信息,决定了CPU的寻址能力
一根导线可以传输0或者1两种情况,有n根地址总线,就有 2^n bit 的寻址能力
8086CPU是16位架构,一次能够处理的地址位16位,但8086有20位地址总线,是因为采用了在内部用两个16位地址形成一个20位物理地址的方法:
物理地址 = 段地址 x 16 + 偏移地址
段地址 和 偏移地址 都是16位,而段地址 x 16 后,在16进制中就进位了(末尾加个0),所以可以这样计算物理地址
比如段地址为 1234H,偏移地址为 1234H,段地址向左移一位,相加得到物理地址为13574H
12340
+ 1234
______
13574
可以使用分段的方式管理内存,将地址连续的内存单元视为一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元
由于段地址x16必然是16的倍数,所以起始地址的结尾必然为0(16进制)
偏移地址最大为FFFFH,即65536个内存单元,所以8086CPU一个段最长为65536 x 1 B = 64KB
寄存器
通用寄存器(AX、BX 、CX、DX)
8086CPU的所有寄存器都是16位的,可以存放2字节
通用寄存器存储一般性数据
为兼容8位,又可以将其分为高位(H)和低位(L),如AX(16位)可以分为AH和AL两个独立8位寄存器使用,其他通用寄存器以此类推
比如AX中数据为1234H,即可以表示4660D/1234H(AX)一个数值,也可以视为12H/18D(AH)和34H/52D(AL)两个数值
8086CPU可一次性处理两种尺寸的数据:
字节(byte),存储在8位寄存器
字(word),由2个字节组成,分为高位字节和地位字节,存储在16位寄存器
代码段寄存器(CS)、指令指针寄存器(IP)
内存中的数据,既可以当成普通数据,也可以当成指令
8086CPU会将CS:IP指向的内容当作指令执行,CS存储段地址,IP存储偏移地址,
CS:IP指向的物理地址:CS X 16 + IP
几条汇编指令(MOV、ADD、SUB)
指令 | 用途 | 高级语言表达 |
---|---|---|
MOV AX, 18 | 18传入寄存器AX | AX = 18 |
MOV AX, BX | BX数据传入AX | AX = BX |
ADD AX, 8 | AX数据加上8 | AX = AX + 8 |
SUB AX, 8 | AX数据减去8 | AX = AX - 8 |
若低位寄存器出现溢出,会丢弃左边的数据,不会进位到高位寄存器
Debug使用
指令 | 用途 |
---|---|
r | 查看寄存器和要执行的汇编指令![]() ![]() |
e | 编辑073F:0100处的内存。00为新值![]() |
d | 查看内存![]() |
a | 向内存写入汇编指令![]() |
u | 将内存中的数据翻译为汇编指令![]() |
t | 执行汇编指令![]() |
寄存器(内存访问)
DS(段寄存器)和[address]
DS寄存器存放要访问的内存的段地址,[address]为偏移地址
- 将1000:0送入AX:
MOV BX, 1000
MOV DS, BX ;不能直接 MOV DS, 1000
MOV AX, [0]
- 将AX送入1000:0:
MOV [0], AX
内存中字的存储
一个内存单元为1字节,一个字为2字节,在内存中存储一个字,字的低位字节放在低地址值单元,高位字节放在高地址值单元。如:将1234H送入内存,由于12H位于寄存器中的高8位,所以需要存储在内存的高位(后面),所以1234在内存看起来是“倒着”的
内存地址 | 数值 | 寄存器 | 数值 |
---|---|---|---|
073F:0000 | 34 | AL | 34 |
073F:0001 | 12 | AH | 12 |
栈机制(PUSH&POP指令,SS&SP寄存器)
栈是一种具有特殊的访问方式的存储空间。
最后进入这个空间的数据,最先出去。
SS存放栈顶段地址,SP存放偏移地址,SS:SP指向栈顶
push ax:将ax送入栈中
pop ax:将栈顶数据送入ax
出入栈的单位都为字(16位)
PUSH入栈:执行后,SP=SP-2,将数据送入内存
栈空时,SS:SP指向栈最高地址的下一个单元
POP出栈:执行后,SP=SP+2,数据从内存中送出,但数据依然存在,直到被覆盖
栈顶超界
8086CPU只用SP:PP存储栈顶段地址和偏移地址,并不能限制栈顶上限和栈底,执行push,pop时CPU并不能保证栈不会超界。