一个典型的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为例,寄存器的逻辑结构如图所示。

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)为例:

AX拆分

字在寄存器中的存储

出于兼容性考虑,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
2
3
4
mov ax,bl	(在 8位寄存器和16位寄存器之间传送数据)
mov bh,ax (在 16位寄存器和8位寄存器之间传送数据)
mov al,20000 (8位寄存器最大可存放值为255的数据)
add al,100H (将一个高于8位的数据加到一个8位寄存器中)

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mov ax, 62627	  AX=F4A3H

mov ah,31H AX=31A3H

mov al,23H AX=3123H

add ax,ax AX=6246H

mov bx,826CH BX=826CH

mov cx,ax CX=6246H

mov ax,bx AX=826CH

add ax,bx AX=04D8H

mov al,bh AX=0482H

mov ah,bl AX=6C82H

add ah,ah AX=D882H

add al, 6 AX=D888H

add al,al AX=D810H

mov ax,cx AX=6246H
1
2
3
4
5
#编程计算2^4
mov ax,2
add ax,ax #ax=2+2
add ax,ax #ax=4+4
add ax,ax #ax=8+8