美文网首页
汇编复习-寄存器

汇编复习-寄存器

作者: NoviceQAQ | 来源:发表于2018-08-09 00:13 被阅读0次

    加班再晚,该看的汇编还是得看完。if you're struggling,that means you're progressing.看书时不写废话


    一个典型的CUP是由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。在CUP中:

    • 运算器进行信息处理;
    • 寄存器进行信息存储;
    • 控制器控制各个器件进行工作;
    • 内部总线连接各种器件,在它们之间进行数据的传送。

    8086CPU共有14个寄存器,分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。程序员通过改变各种寄存器中的内容来实现对CPU的控制。

    通用寄存器(AX、BX、CX、DX)

    8086CPU的所有寄存器都是16位的,和数据总线一样同为16位,可以存放两个字节AX、BX、CX、DX用于存放一般的数据,被称为通用寄存器。一个寄存器能存储的最大值为1111111111111111(二进制),65535(十进制)。
    每个寄存器都能分为两个独立使用的8位寄存器来使用,例如AX可分为AH和AL。

    注意16位寄存器被拆分为8位后16进制的变化

    字在寄存器中的存储

    8086CPU可以一次性处理以下两种尺寸的数据。1、字节(byte),一个字节由8个bit组成;2、字(word),一个字由两个字节组成。
    这里说下数制,通常我们使用十六进制来表示一个数据,因为4位二进制数代表一位16进制数,这样看起问题来更为直观。比如二进制0100111000100000可表示为4(0100)、E(1110)、2(0010)、0(0000)十六进制数,如果这个数据在AX中,那么AH为4E、AL为20

    几条汇编指令

    汇编指令 控制CPU完成操作 用高级语言的语法描述
    mov ax,18 将18送入寄存器AX AX=18
    mov ah,78 将78送入寄存器AH AH=78
    add ax,8 将寄存器AX中的数值加上8 AX=AX+8
    mov ax,bx 将寄存器BX中的数据送入寄存器AX AX=BX
    add ax,bx 将AX和BX中的数值相加 AX=AX+BX

    注意:
    1、当ax = 8226;bx = 8226执行指令add ax,bx把bx的数据加入ax。ax = 8226 + 8226 = 1044C,但是ax为16为寄存器,只能存放4位十六进制数据所以ax的数据位944C。如果使用的是ah、al8位寄存器,和十六位也是同理。
    2、在使用汇编进行数据传送或运算时,注意指令的两个操作对象的位数应当是一致的。比如8位寄存器应该和8位寄存器或者8位寄存器最大值255的数据进行运算;16位寄存器应该和16位寄存器或者16位寄存器最大值65535的数据进行计算。

    物理地址

    每一个内存单元在存储空间中都有唯一的地址,我们将这个地址称为物理地址。在CPU向地址总线上发出物理地址之前,必须在内部形成这个物理地址。

    16位结构的CPU

    8086的CPU为16位结构的CPU,特征如下:

    • 运算器一次最多可以处理16位数据
    • 寄存器的最大宽度为16位(如AX)
    • 寄存器和运算器之间的通路为16位(数据总线16位)

    8086CPU给处物理地址的方法

    8086有20位地址总线,也就是达到2^20*8bit(每个内存单元的大小)=1MB的寻址能力。但是8086又是16位结构在内部一次性处理、传输、暂时存储的地址位16位地址,也就是只达到64KB的殉职能力。

    8086CPU采用了地址加法器将2个16位地址合成为一个20位物理地址。

    8086CPU相关部件得逻辑结构

    地址加法器采用物理地址=段地址×16+偏移地址的方法合成物理地址。

    打比方
    从学校到图书馆的距离位2826米。

    学校到图书馆的距离

    当同学A用纸条告诉同学B距离时候,可以在纸条上写入2826。但是如果纸条有两张,但每张纸条只能写三个数字的时候,可以在第一张纸条写入200,第二张纸条写入826,然后约定第一张纸条×10后与第二张纸条相加,200×10+826=2826米。

    段地址×16
    段地址×16有个更为常用的说话是二进制左移4位,用二进制举例如下:

    左移位数 二进制 十六进制 十进制
    0 10 2 2
    1 100 4 4
    2 1000 8 8
    3 10000 10 16
    4 100000 20 32

    故地址加法器的工作过程如下图所示:

    地址加法器工作过程

    段的概念

    CPU使用将内存分段的方式来管理内存。例如:10000~100FF内存单元组成一个段,该段的段地址为1000H(根据公式段地址左移4位与偏移地址相加得到的物理地址)大小为100H(0~FF,为FF+1=100)

    分段

    因为数据可以通过不同的段地址和偏移地址指向同一物理地址(段地址2000H,偏移地址1F60H 或者 段地址2100H,偏移地址0F60H),故在描述中可以写为:

    • 数据存在内存2000:1F60单元中。
    • 数据存在内存的2000H段中的1F60H单元中。

    段寄存器(CS、SS、DS、ES)

    如要访问内存时需要提供段地址和偏移地址。段地址在段寄存器中存放。8086CPU有4个寄存器(CS、SS、DS、ES)

    CS和IP

    CS和IP时8086CPU中最关键的寄存器,CS为代码段寄存器,IP为指令指针寄存器,在任意时刻,CPU将CS:IP(CS×16+IP)指向的内容当作指令执行。
    运算时运行过程如下:

    1 2 3 4 5 6 7 8

    在8086CPU加电启动或复位后,CS和IP被设置为CS=FFFFH, IP=0000H,即在开机启动时,CPU从内存FFFF0H单元中读取第一条指令开始执行。
    如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

    修改CS、IP的指令

    我们通常使用mov指令来修改通用寄存器的值,但是不能用该指令修改CS、IP的值。能够改变CS、IP的内容的指令统称为转移指令。
    jmp指令

    • jmp 2AE3:3,执行后,CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。
    • 若只想修改IP的值,可以“jump 某一合法寄存器”
    jmp ax AX CS IP
    执行前 1000H 2000H 0003H
    执行后 1000H 2000H 1000H

    代码段

    将若干地址连续的内存单元看作一个段,根据公式“物理地址=段地址×16+偏移地址”那么:

    • 段的起始地址一定是16的倍数。
    • 偏移地址为16位,16位地址的寻址能力为2^16=64KB,所以一个段的最大长度为64KB。

    将一段内存当作代码段,仅是我们在编程时的一种安排,若要让CPU执行我们放在代码段中的指令,必须将CS:IP指向我们定义代码段的首地址。

    相关文章

      网友评论

          本文标题:汇编复习-寄存器

          本文链接:https://www.haomeiwen.com/subject/bqrzvftx.html