1: 数据的表示
微型计算机的字长与微处理器的寄存器位数有关。
- 以 Intel 80X86 系列微处理器为例,CPU 是 8086/8088、80286 的字长是 16 位(二进制位 bit),那么它们的寄存器的位数一定是 16 位的;
- 32 位字长的微机 CPU 是 80386/80486 或者 Pentium 系列,它们的寄存器的位数则是 32 位的。
学习汇编语言我们会用到十六进制(H)的数据形式,要使自己尽快习惯用十六进制来思维。在汇编语言中,数值后面分别用字母B
、H
、D
代表二进制(Binary)、十六进制(Hexadecimal)、十进制数(Decimal)(十进制数可以省略 D
)。
在计算机中还规定采用字节、字、双字等单位来表示数据。
- 字节(Byte):8 位二进制数。如
00000101B
或表示成05H
;10000101B
或表示成85H
。 - 字(Word):16 位二进制数,等于 2 字节。如
1100010111010110B
或表示成C5D6H
。 - 双字(Double Word):32 位二进制数,又称为双精度数,等于 4 字节。如
23456789H
。
2: 寄存器的分类
8086 寄存器都是 16 位的寄存器,根据用途可分为 4 种类型。分别是数据寄存器、地址寄存器、段寄存器和控制寄存器
(1)数据寄存器
数据寄存器中每个寄存器又可以分为 2 个 8 位的寄存器。分别为 AH、AL,BH、BL,CH、CL,DH、DL。H 表示高字节(高 8 位)寄存器、L 表示低字节(低 8 位)寄存器。
例如:用 AX 寄存器存放一个字 1234H,表示为 (AX)=1234H,即高字节 12 放在 AH,低字节 34 放在 AL 中。
(2)地址寄存器
地址寄存器包括指针和变址寄存器 SP、BP、SI、DI 四个 16 位寄存器。
顾名思义,它们可用来存放存储器操作数的偏移地址。另外,它们也可以作为通用寄存器用。
(3)段寄存器
8086CPU 有 4 个 16 位的段寄存器,分别是 CS 代码段寄存器、DS 数据段寄存器、ES 附加段寄存器、SS 堆栈段寄存器。
(4)控制寄存器
控制寄存器包括 IP 和 FLAGS(又称为 PSW 程序状态字)两个 16 位寄存器,用于控制程序的执行。
IP 指令指针寄存器,用来存放代码段中的偏移地址,指出当前正在执行指令的下一条指令所在单元的偏移地址。
FLAGS 标志寄存器中的某位代表 CPU 的 1 个标志,表示出 CPU 的某种执行状态。最低位为 D0,最高位为 D15。8086CPU 的标志寄存器共有 9 个标志,分别为 6 个条件码标志和 3 个控制标志。如图:
(1)条件码标志
- CF 进位标志。当指令执行结果的最高位向前有进位时,CF=1,否则 CF=0。
- SF 符号标志。当指令执行结果的最高位(符号位)为负时,SF=1,否则 SF=0。
- ZF 零标志。当指令执行结果为 0 时,ZF=1,结果不为 0 时,ZF=0。
- OF 溢出标志。当指令执行结果有溢出(超出了数的表示范围)时,OF=1,否则 OF=0。
- AF 辅助进位标志。当指令执行结果的第 3 位(半字节)向前有进位时,AF=1,否则 AF=0。
- PF 奇偶标志。当指令执行结果中 1 的个数为偶数个时,PF=1,否则 PF=0。
(2)控制标志
- DF 方向标志。执行串处理指令时,若设置 DF=0,存储单元的地址寄存器的值自动增加,若设置 DF=1,存储单元的地址寄存器的值自动减小。
- IF 中断标志。设置 IF=1,允许 CPU 响应可屏蔽中断,IF=0 则不响应。
- TF 陷阱标志。在 DEBUG 调试时,TF=1,采用单步执行方式,即进入陷阱;TF=0,正常执行程序。
根据计算结果可知 CPU 会自动地把标志位设为:CF=0,SF=1,ZF=0,OF=0,PF=0,即无进位,结果为负数,结果不为 0,没有溢出,奇数个 1。
数的补码运算
在计算机中,对带符号数可用真值和机器数两个概念表示。
真值,就是带有“+”、“-”号的实际数值;所谓机器数,则是把“+”、“-”符号数值化(0、1)后所得到的计算机实际能表示的数。
机器数有三种码表示,分别是原码、反码和补码。汇编语言中,数都是以补码的形式表示的,因此必须掌握数的补码表示和补码的运算。这三种码的定义如下:
- 原码。原码将最高位作为符号位,正数为 0,负数为 1,其余 7 位作为数值位。
- 反码。正数的反码与正数的原码一样。而求负数的反码时,符号位为 1,数值位在原码的基础上求反。
- 补码。正数的补码与正数的原码一样。求负数的补码时,符号位为 1,数值位在原码的基础上求反加 1。
例:十进制数 +5 和 -5 分别表示成二进制数原码、反码和补码。
[+5]原 = [+5]反 = [+5]补 = 00000101B [-5]原 = 10000101B [-5]反 = 11111010B [-5]补 = 11111011B
3 : 地址的理解
(1)物理地址
物理地址是内存单元的真实地址,存储单元的物理地址是唯一的。
Intel 8086 CPU 有 20 根地址线,因此其存储空间可达 2 的 20 次方 = 1 M 个字节单元(1MB)。地址都是从 0 开始的,在 20 位地址线的存储空间中采用十六进制表示的物理地址范围是 00000H
~ FFFFFH
。
(2)逻辑地址
逻辑地址是用户编程时使用的地址,分为段地址和偏移地址两部分。
在 8086 汇编语言中,把内存地址空间划分为若干逻辑段,每段由一些存储单元构成,每段最大为 65536 个字节单元(0 号单元~65535 号单元 0000H~FFFFH)。用段地址指出是哪一段,偏移地址标明是该段中的哪个单元。段地址和偏移地址都是 16 位二进制数。
逻辑地址的形式:段地址:偏移地址
在上图中,内存划分出了若干段。0 号段,1 号段,...,每一段都有 0 号单元、1 号单元、2 号单元,...。每段的长度可以不一样,如 0 号段从 0 号单元到 0FH 号单元共 16 个字节单元,1 号段从 0 号单元到 0139H 号单元共 314 个字节单元
- 比如 0000:0002H 代表 0 号段的 2 号单元,0001:0002H 代表 1 号段的 2 号单元
地址转换公式:
物理地址 = 段地址 × 10H + 偏移地址
存储器逻辑分段类型如下:
- 代码段:用于存放指令,段地址存放在段寄存器 CS。
- 数据段:用于存放数据,段地址存放在段寄存器 DS。
- 附加段:用于辅助存放数据,段地址存放在段寄存器 ES。
- 堆栈段:是重要的数据结构,可用来保存数据、地址和系统参数,段地址存放在段寄存器 SS。
一个实际的存储单元只能存放一个字节(8 位二进制)的数据。存储单元的地址和内容的表示形式为用括号将地址括起来以代表单元的内容。如(3075AH)=12H,表示 3075AH 号单元中的内容是 12 H,称为字节单元;若(37692H)=5678H,表示 37692H 单元和 37693H 单元一起存放 5678H,该单元是字单元。字单元在存储的时候,高字节放在高地址单元,低字节放在低地址单元,即 56H 放在 37693H 单元,78H 放在 37692H 单元:
这个我在汇编语言编程例子 我也介绍过