汇编语言学习(寄存器)

53 阅读8分钟

cpu对存储的器的读取

cpu要想进行数据的读写,必须与(芯片)进行交互

  • 存储单元的地址(地址信息)
  • 器件的选择,读或写的命令(控制信息)
  • 读或写的数据(数据信息)
    在计算机当中,专门有连接cpu和其他芯片的导线,称做“总线”,总线的逻辑又分为:地址总线, 控制总线和数据总线。

地址总线

CPU是通过地址总线来指定存储单元的,可见地址总线上能传送多少个不同的信息,cpu就可以对多少个存储单元进行寻址。
一个cpu有N个地址总线,可以说cpu的地址总线的宽度为N,最多可以寻找2^N次方个内存单元

数据总线

CPU与内存或者其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界数据的传送速度,8根数据总线可以传送一个8位的二进制数据(一个字节),16根则可以传送2个字节。

控制总线

CPU对外部器件的控制是通过控制总线来进行的,有多少根控制总线,意味着CPU提供了对外部器件的多少种控制,所以控制总线的宽度决定CPU对外部器件的控制能力

知识点总结

  • 存储单元:通常1字节代表一个存储单元,也就是1Byte。同时等同于8bit(比特)
  • 地址总线的宽度和寻址之间的关系是2^N(N带表根数),例如16根的寻址大小为 2^102^6 = 641024Byte = 64KB
  • 数据总线的宽度和传输数据的大小关系为8根 = 1Byte(字节),例如:总线宽度为8根,一次性可以传输 1(B),16根可以传输2(B)
  • 从内存中读取数据,首先要了解数据总线的宽度,根据数据总线的宽度去评估传输的大小,例如:从内存中读取1KB的数据,8086(16g根)至少要读512次。(16根每次传输2字节,所以1024字节/2 = 512次)
  • 在存储器中,数据和程序是以二进制形式进行存放。

寄存器

CPU由运算器,控制器,寄存器等器件构成,这些器件靠内部总线相连,总线相当于CPU的外部总线,内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。

  • 运算器进行信息处理
  • 寄存器进行信息存储
  • 控制器控制各个器件进行工作
  • 内部总线连接各个器件,在它们之间进行数据的传送
  • CPU的主要部件就是寄存器,寄存器是可以进行读写的部件。
  • 不同的CPU,寄存器的个数,结构是不同的。

通用寄存器

8086CPU的所有寄存器是16位的,可以存放两个字节,AX,BX,CX,DX.这四个寄存器通常存放一般性的数据,被称为“通用寄存器”

  • AX可分为AH和AL
  • BX可分为BH和BL
  • CX可分为CH和CL
  • DX可分为DH和DL

字在存储器中存储

  • 字节(byte):由8bit组成,可以存在8位寄存器中。
  • 字(word):一个字由两个字节组成,这两个字节分为高位字节和低位字节

几条汇编指令

image.png

知识点总结

  • 十六进制数的加减法的进/借位规则为:借一当十六,逢十六进一。
    1,借一当十六:3D25H - 05C3H 运算方式如下
    5-3 = 2,2-c = 2+16-12 = 6(由于2-12小于0,需要借一位,一位为16)
    D-5 = 13-5-1 = 7(在减去一个1是因为上面运算2-c借了一位)
    3-0 = 3 ,最终结果为:3762H
    2,逢十六进一:同理相加大于16则进一位,例如:3762H+05C3H
    2+3 = 5,6+c = 6+12 = 18 = (18-16) = 2(此时大于16要进一位)
    7+5 = 12 +1 = 13 = D(由于6+12进一位所以需要+1)
    3+0 = 3,最终结果为:3D25H
  • 在进行汇编指令运算时(add ax,bx)他们的位数要一致才可以
  • 十进制转换十六进制,将当前数值每次除以16取余。例如:4877转换16进制
    1,4766/16 = 304 余13(D)
    2,304/16 = 19 余0
    3,19/16 = 1 余3
    4,1/16 = 0 余1 最终结果为:130DH
  • 十六进制的乘法运算

image.png

物理地址

CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间都有唯一的地址,这个唯一地址称为“物理地址”。CPU通过地址总线送入存储器,必须是一个内存单元的物理地址。在CPU向地址总线发出物理地址之前,必须要在内部先形成这个物理地址。

16位结构的CPU

描述一个CPU具有下面几方面的结构特性

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

8086CPU给出物理地址的方法

8086CPU有20位地址总线,可以传送20位地址,达到1MB(2^20Byte)寻址能力,8086CPU又是16位结构,在内部一次性处理,传输,暂时存储的地址为16位,如果地址从内部出发,他只能传送16位的地址,表现出的寻址能力只有64KB
8086CPU采用两个16位地址合成的方法形成一个20位的物理地址

image.png 当8086CPU要读写内存时的步骤

  • 1,CPU相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址。
  • 2,段地址和偏移地址通过内部总线送入一个地址加法器的部件
  • 3,地址加法器将两个16位地址合并成一个20位的物理地址
  • 4,地址加法器通过内部总线将20位送入输入输出控制电路
  • 5,输入输出控制电路将20位物理地址送上地址总线
  • 6,20位物理地址被地址总线传送到存储器
  • 地址加法器合成物理地址的方法是:段地址*16+偏移地址 = 物理地址
    物理地址为什么这么计算?本质是什么?
    总结就是:因为两个16位进制的寻址能力是有限的,需要重新生成一个20位的物理地址,需要提供两张16位的数据地址去合成一个地址。(个人大概理解)

知识点总结

  • 给定段地址0001H,仅通过变化偏移地址寻址,CPU的寻址范围是多少?
    答:由于物理地址 = 段地址16 + 偏移地址。那重点要了解偏移地址的范围[0000H ~ FFFFH], 所以段地址16 =0001H*16 = 00010H(乘以16相当于左移一位),那范围就是[00010H+0000H ~ 00010H+FFFFH] = 00010H~01000FH

段寄存器

8086CPU有4个段寄存器(段地址是在段寄存器存储),分别为CS,DS,SS,ES。本章讨论CS

CS和ip

cs:代表代码段寄存器假设为M,ip:代表指令指针寄存器假设为N。8086CPU将从M*16+N开始,读取一条指令并且执行

image.png

  • 当前的CS为20000H,IP为0000H时,CPU将内存2000H*16+0000H读取指令执行。
  • CS,IP的内容送入地址加法器中,生成20位物理地址(CS*16+IP)
  • 地址加法器将物理地址送入输出输出控制电路
  • 输入输出控制地址将物理地址送上地址总线
  • 从内存20000H单元开始存放机器指令B8 23 01通过数据总线送入CPU
  • 输入输出控制器将机器指令B8 23 01送入指令缓冲器
  • IP的值自动添加,使CPU读取到下一条的指令,因当前的指令为B82301长度为3,所以IP中的值加3,此时CS:IP指向20000H:0003
  • 依次类推,循环执行,IP根据读取的字节进行递增

修改CS和IP的指令

使用命令Jmp

  • jmp 2AE3:3,执行后CS=2AE3H IP=0003H,CPU将从2AE33H处读取指令(cs*16+ip = cs<<1+ip)
  • jmp 3:0B16 CS = 0003H IP = 0B16H CPU将从00B46H处读取指令
  • jmp ax
    执行前:ax=1000H,cs=2000h,ip=0003h
    执行后:ax=1000H,cs=2000h,ip=1000H(类似MOV IP,AX -- 这里是一个比喻,不是可以用此方法进行处理)

代码段

将一组内存单元定义为一个段,我们可以将长度N(N<64KB)的一组代码,存在一组连续,起始地址为16倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,定义为一个代码段

总结

下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答:一共四次,每次执行一次指令修改一次,jmp ax执行了二次(执行指令执行一次,修改寄存器的Ip执行一次),由于sub ax ax 命令执行,导致ax = 0000H, 最后一步jmp ax 相当于将ip值转换成ax,即:IP = 0000H;