8086存储器组织

分类:内存(主存储器,CPU直接存取)、外存(辅助存储器,CPU通过I/O接口读取)

COM文件结构

COM文件是类似于exe的计算机可直接执行的文件。
COM文件组成如下:

  • 程序前缀PSP
  • 指令代码
  • 数据区
  • 堆栈区

内存与寄存器

  • 寄存器是CPU内部暂存数据的存储单元,内存、外存都是CPU外部的存储空间。
  • 每个存储单元存放一个字节的内容,并且都有一个存储器地址。

计算机数据表达与存储

二进制位bit:1位二进制
字节byte:8位二进制
字word:16位
双字dword:32位
LSB(最低有效位):数据的最低位
MSB(最高有效位):数据的最高位

多字节数据在存储时占连续多个存储单元:
存放:低字节低地址,高字节高地址
表达:低地址表示多字节数据地址

汇编语言课堂笔记——内存管理_指针
图中[0002H]的字内容为:1234H
图中[0002H]的双字的内容为:78561234H

8086CPU内存范围

8086CPU有20条地址线,而8086寄存器最大16位。
(地址空间需存放在寄存器中,因此一个寄存器最大16位不能表征20位的物理地址,这种情况下就出现了分段的概念)
为了解决这个问题,8086CPU将内存空间分为很多逻辑段(Segment),每个逻辑段包含多个内存单元,用一个寄存器保存段地址(逻辑段起始地址),用另一个寄存器存储偏移地址(某内存单元到起始地址的距离)

8086有4个16位段寄存器:

  • CS(代码段):指明代码段起始地址
  • SS(堆栈段)
  • DS(数据段)
  • ES(附加段)

指令的组成

指令由操作码(mov,add…)和操作数(即操作的对象,具体数值,寄存器)两部分组成。

操作码 操作数1,操作数2;注释
mov a1,a2;

操作数1:目的操作数dest
操作数2:源操作数src

寄存器表达 含义
r8 任意一个8位通用寄存器
r16 16位通用寄存器
reg 代表r8或r16
seg 段寄存器
存储器表达 含义
m8 一个8位存储器操作数单元
m16 16位
mem 代表m8或m16
立即数表达 含义
i8(16) 8(16)位立即数
imm 代表i8或i16
dest 目的操作数
src 源操作数

8086的寻址方式

立即数寻址

指令中的操作数直接存放在机器代码中。这种操作数称为立即数imm。
汇编语言课堂笔记——内存管理_寄存器_02

寄存器寻址方式

操作数存放在CPU的内部寄存器reg中。
汇编语言课堂笔记——内存管理_操作数_03

存储器寻址方式

指令中给出操作数的主存地址信息(偏移地址EA),默认段地址在DS段寄存器中。

  • 直接寻址方式:指令中给出有效地址,MOV AX,[2000H]
  • 寄存器间接寻址方式:有效地址存放在BX或SI、DI中;MOV AX,[SI]
  • 寄存器相对寻址方式:有效地址为寄存器(BX、BP、SI、DI)内容与有符号数位移量之和;MOV AX,[DI+06H]
  • 基址变址寻址方式:有效地址为BX/BP+SI/DI;MOV AX,[BX+SI]
  • 相对基址变址寻址方式:有效地址=BX/BP+SI/DI+8/16位位移量;MOV AX,[BX+SI+06H]

C语言中的指针

汇编语言课堂笔记——内存管理_指针_04

不同类型指针的区别

不同类型指针的指针都是一个变量,存储的为不同类型数据的地址。数据类型的不同,导致数据占据的字节数不同,因此在使用指针读取、赋值、偏移时,读取或修改、移动的字节数不同。

指针加减运算的原理

指针的加减运算即指向原指向位置存储的下一个变量。例如p++,指针变量增加的值与指针的类型有关,若指针指向的数据具有2个字节,则指针变量增加2个字节的大小,若指针指向的数据具有4个字节,则指针变量增加4个字节的大小。

什么是指向指针的指针

指向指针的指针也是变量,变量中存储的为某个指针的位置。