寄存器

  一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。相对于CPU内部来说是外部总线。内部总线是实现CPU内部各个器件址线的联系。

  • 简单地说,在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为例,寄存器的逻辑结构如下图:
  • 为了保证与上一代CPU中的寄存器(8位)兼容,8086CPU的AX、BX、CX、DX这4个寄存器都可以分为两个可独立使用的8位寄存器来用:
  • 在寄存器中的存储:8086CPU可以一次性处理以下两种尺寸的数据

    • 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中

    • 字:记为word,一个字由两个字节组成,分别称为字的高位字节和地位字节

  • 如下图所示的一个字型数据20000,存在AX寄存器中,在AH中存储了高8位,在AL中存储了低8位。这个数据既可以看作是一个字型数据,也可以看作是两个字节型数据,它们的大小分别是78和32。

  • 常用的汇编指令及语法描述:在写一条汇编指令或一个寄存器的名称时不区分大小写
    • 例如下图所述的讲BX中的数据送入AX中的时候,BX中的值不会清空。

    现在如果AX寄存器中的值为8226H,BX为8226H,add ax,bx那么ax中的值为?

    相加后的值为1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能放在ax中保存,ax中的数据为:044CH

寄存器运算

执行mov ax,001AH & mov bx,0026H

  • 执行 add al,bl那么此时ax寄存器的值为?

    • 首先al和bl是指ax和bx寄存器中的低位字节,也就是16位长度的后8位,那么1AH和26H转换成二进制也不过8位,其实就是计算1AH+26H=40H
  • 接着执行 add ah,bl 那么此时ax寄存器中的值为?

    • 语法的意思是,把bx中的低位bl加到ax中的高位中:bl = 26H ah = 0H,相加ah = 26H,那么ax = ‘ah’ + ‘al’ = 2640H
  • 续执行 add bh,al 那么此时bx寄存器中的值为?

    • 把ax低位值加到bh高位值:al = 40H bh = 00H,那么相加得bh = 40H,bx = 2640H
  • 问题:在ax低位al字节加上93H的话,相加所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H。这里所谓的丢失是指进制位值不能在8位寄存器中保存,但CPU并不是真正丢弃这个进制位。
    • 我们有一点需要注意的是,此时的al是作为一个独立的8位寄存器来使用的,和ah没有关系,cpu在执行这条指令时认为ah和al是两个不相关的寄存器。但在执行add ax,93H时候CPU会认为只有一个16位寄存器ax,进行16位运算所以我们在进行数据传输或运算时,要注意指令的两个操作对象的位数应当是一致的。例如mov ax,bl 或者 mov bh,ax , add al,100H都是错误的指令。

    • 最多使用4条指令,编程计算2的4次方: mov ax,2|add ax,ax |add ax,ax|add ax,ax