CPU的结构和寄存器
一个典型的CPU(此处讨论的不是某一具体的CPU)由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连。前一章所说的总线,相对于CPU内部来说是外部总线。
内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。简单地说,在 CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在它们之间进行数据的传送。
《深入》一书中的结构如下图:
![新文档 2018-01-24_1](CPU的结构和寄存器\新文档 2018-01-24_1.jpg)
PC是指程序计数器,书中原话是“处理器的核心是一个字长的存储设备(或寄存器),称为程序计数器(PC)”,“寄存器文件是一个小的存储设备,由一些1字长的寄存器组成,每个寄存器都有唯一的名字”,“ALU计算新的数据和地址值”。???emm,恕我愚钝,看不懂,不知是翻译的锅,还是原作的锅,这段狗屁不通。
对于一个汇编程序员来说,CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。不同的CPU,寄存器的个数、结构是不相同的。8086CPU有 14个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
通用寄存器
8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
以AX为例,寄存器的逻辑结构如图所示。
其存放的最大值是2^16。
8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,8086CPU的AX,BX,CX,DX这四个寄存器都可以分为两个独立使用的8位寄存器(高位字节,低位字节)来使用:
AX可分为AH和AL;
BX可分为BH和BL;
CX可分为CH和CL;
DX可分为DH和DL。
以AX表示20000(D)为例:
字在寄存器中的存储
出于兼容性考虑,8086CPU可以一次性处理两种尺寸的数据。
字节:记为byte, —个字节由8 个 bit组成,可以存在8 位寄存器中。
字:记 为 word, 一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。
字:16bit;字节:8bit。在上图中,20000(D)表示为01001100 01000000,共16位,如果分开的话分别表示78和32。
几条汇编指令
简单来说:指令内容 目标 内容或位置(不区分大小写)
下表是练习1(H表示十六进制)
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|---|---|
mov ax,4E20H | 4E20H | 0000H |
add ax,1406H | 6226H | 0000H |
mov bx,2000H | 6226H | 2000H |
add ax,bx | 8226H | 8226H |
mov bx,ax | 8226H | 8226H |
add ax,bx | 044CH | 8226H |
最后一行的044CH是因为8226H+8226H=1044CH,但是寄存器里放不下1。
练习2:
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|---|---|
mov ax,001AH | 001AH | 0000H |
mov bx,0026H | 001AH | 0026H |
add al,bl | 0040H | 0026H |
add ah,bl | 2640H | 0026H |
add bh,al | 2640H | 4026H |
mov ah,0 | 0040H | 4026H |
add al,85H | 00C5H | 4026H |
add al,93H | 0058H | 4026H |
同理,C5+85=158,只保留了58。然而,舍弃的数值不是真的丢了。这里如果改为add ax,93H,则结果为0158H。
注意,al是作为一个独立的8 位寄存器来使用的,和 ah没有关系,CPU在执行 这条指令时认为ah和 al是两个不相关的寄存器。不要错误地认为,诸如add al,93H的指 令产生的进位会存储在ah中,add al,93H进行的是8 位运算。
注意,在进行运算或传送时,一定要保证两个操作对象的位数是一致的。
1 | mov ax,bl (在 8位寄存器和16位寄存器之间传送数据) |
练习
1 | mov ax, 62627 AX=F4A3H |
1 | #编程计算2^4 |