汇编语言(面向机器的程序设计语言)
第二章 信息的大本营——寄存器
CPU概述
一个典型的CPU由运算器、控制器、寄存器等器件组成。运算器进行信息处理,寄存器进行信息存储,控制器控制各种器件进行工作。内部总线连接各种器件,在它们之间进行数据的传送,实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其它器件的联系。这个章节所介绍的寄存器是CPU中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容来实现对CPU的控制。
不同的CPU,寄存器的个数和结构都是不同的。8086CPU有14个寄存器,每个寄存器都有对应的名称分别为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
2.1 通用寄存器
8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。以AX为例,16位寄存器的逻辑结构如下图:
16位寄存器的逻辑结构,其存放的无符号数据范围:0 ~ 2^16 -1
为了与早期CPU操作兼容,这4个寄存器均可拆分成两个8位寄存器单独使用,分别为AX分为AH和AL,BX分为BH和BL,CX分为CH和CL,DX分为DH和DL,下面以AX为例:
AH和AL存放的无符号数据范围:0 ~ 2^8 -1
一个字由两个字节组成,可以存在一个16位寄存器中。字的高8位存放于通用寄存器的高8位寄存器字的低8位存放于通用寄存器的低8位寄存器。如下图所示:
存储实例演示:
2.2 汇编指令:mov,add
注意事项: 在mov和add指令中,两个操作对象的位数应一致。
2.3 物理地址
CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
8086结构表示物理地址的障碍:8086内部的寄存器都是16位的,而外部地址总线宽度为20位。能存放的地址数据范围:0 ~ 216-1 (64KB)而对应的地址单元:0 ~ 220-1 (1MB)。
解决途径:8086在内部用两个16位地址 通过计算合成得到一个20位的物理地址。计算合成由CPU内部的地址加法器实现。
2.4 段的认识
段是8086为解决用16位寄存器表示20位的物理地址而引入的一个逻辑上的概念。可以根据需要,将地址连续、起始物理地址为16倍数的一组内存单元(不超过64KB)当作一个段使用。
段的划分是灵活的,一个物理地址可以用不同的「段地址: 偏移地址」表示。只要满足段的起始物理地址是16的倍数。在写法上,地址通常用十六进制表示。表示十六进制的H在「段地址: 偏移地址」中可省略不写。
2.5 CS和IP
CS: 代码段段寄存器,用于存放代码段的段地址。IP: 指令指针寄存器,用于存放CPU将要读取的指令在代码段中的偏移地址。CS:IP对应的物理地址存放的是CPU将要读取的指令。(CS) × 16 + (IP) → 指令的物理地址
计算机工作过程:第1步: CPU基于CS:IP,计算出物理地址,然后到相应的内存单元读取指令,送到指令缓冲区。第2步: CPU自动修改IP的值,IP = IP + 所读取指令的长度,从而为下一条指令读取做准备;第3步: 执行指令。 转第1步,重复此过程。
在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。 IP和CS值的修改不能通过mov指令实现,需借助转移指令。如下图:
检测点2.1
(1)写出每条汇编指令执行后相关寄存器中的值。
第一空:F4A3H ;把十进制数62627变成十六进制就是结果F4A3H
第二空:31A3H ;ah=31h,al不变,所以ax=31A3H
第三空:3123H ;al=23h,ah不变,所以ax=3123h
第四空:6246H ;ax=ax+ax=3123h+3123h=6246h,用计算器算一下结果就出来了
第五空:826CH ;bx=826CH,ax不变
第六空:6246H ;cx=ax=6246H
第七空:826CH ;ax=bx=826CH
第八空:04D8H ;ax=ax+bx=826CH+826CH=04D8H,0前面还有个1,但是ax放不下,所以丢弃,16位寄存器只能放下四位十六进制数
第九空:0482H ;al=bh=82h,ah不变
第十空:6C82H ;ah=bl=6Ch,al不变
第十一空:D882H ;ah=ah+ah=6Ch+6Ch=D8h,al不变
第十二空:D888H ;al=al+6=82H+6=88h,ah不变
第十三空:D810H ;al=al+al=88h+88h=10h,ah不变,结果是110h但al的大小只有8位二进制位,能放下的最大数为FFh,所以高位丢弃,只保留低两位
第十四空:6246H ;ax=cx=6246H
检测点2.2
(1)给定段地址为0001H,仅通过变化偏移地址,CPU的寻址范围为?
在8086CPU中使用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址。 段地址为0001H 基础地址为00010H 偏移地址最小为0000H 偏移地址最大为ffffHCPU的寻址范围为00010H 到 1000fH。
(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为? 最大为?
已知物理地址为20000H 8086CPU偏移地址的取值范围为0000H 到ffffH 则段地址最大为(20000H-0000H)/16=2000H 段地址最小为(20000H-ffffH)/16=(10001)/16 由于段地址1000的最大寻址范围为1ffff,因此最小的满足SA条件的段地址应比1000大1则SA应满足的条件,最小为1001H最大为2000H 。
来源:https://www.cnblogs.com/zsznb/p/9791129.html