混子汇编语言学习之02笔记

作者: 那个混子 | 来源:发表于2021-10-10 23:55 被阅读0次

    第2章 寄存器

    开章:

    前面有博世面试的时候,就问过一个问题,为什么要有寄存器?当时自己也没有说清楚,看完这一章相关的内容,明白了寄存器是什么,干什么的,终于清晰了!

    1、寄存器

    CPU由运算器、控制器、寄存器等器件构成,这些器件靠片内总线相连。

    • 运算器进行信息处理;
    • 控制器控制各种器件进行工作;
    • 寄存器进行信息存储;
      8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW都是16位。
    寄存器是什么:寄存器是暂存指令、数据和地址的一种部件,是程序员可以改变其中内容来控制CPU的部件。

    通俗易懂理解:
    寄存器就是你的口袋。身上只有那么几个,只装最常用或者马上要用的东西。
    内存就是你的背包。有时候拿点什么放到口袋里,有时候从口袋里拿出点东西放在背包里。

    2、通用寄存器

    通用寄存器:通常用来存放一般性的数据,有AX、BX、CX、DX,它们可分为两个可独立使用的8位寄存器。

    由于8086CPU上一代的寄存器是8位的,为了保持向下兼容,这里16位的寄存器可以拆开成两个8位寄存器使用,如下图所示。
    在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。

    就是如下所示:


    3、简单的几条汇编指令

    • mov 指令就是类似于C语言中的赋值的概念
    • add指令就是加法运算
    • 运算都是从右往左运算的
    • 汇编指令助记符是不区分大小写的
    • 在运算中要注意储存的范围大小,计算的结果如果超出了,保留的是没有超出的部分。

    4、物理地址

    概念:所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。就是类似门牌号,编号

    8086CPU给出物理地址的方法

    背景:8086CPU有20位地址总线,可以传送20位地址,达到 1MB寻址能力。但是8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位,内部是不能直接传输20位的地址信息的。

    故8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

    内部逻辑如下图:


    如图2.6所示,当8086CPU要读写内存时:
    (1) CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址:(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
    (3)地址加法器将两个16位地址合成为一个20位的物理地址;
    (4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;
    (6)20位物理地址被地址总线传送到存储器。
    记住公式:物理地址=段地址x16+偏移地址

    提供地址方法的本质

    “段地址x16+偏移地址=物理地址”的本质含义是:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
    更一般地说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址x16可看作是基础地址。
    最终也就是:物理地址 = 基础地址 + 偏移地址

    5、段寄存器

    我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,可以用分段的方式来管理内存。段寄存器是用来提供内存单元的端地址的。
    内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存

    • 用一个段存放数据,将它定义为“数据段”;
    • 用一个段存放代码,将它定义为“代码段”;
    • 用一个段当作栈,将它定义为“栈段”。
    注意:

    一个段的起始地址一定是16的倍数;
    偏移地址为16位,变化范围为0-FFFFH,所以一个段的长度最大为64KB。
    CPU可以用不同的段地址和偏移地址形成同一个物理地址。
    段寄存器:8086CPU有4个段寄存器:CS、DS、SS、ES,提供内存单元的段地址。

    CS和IP

    CS为代码段寄存器,IP为指令指针寄存器
    CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,
    CPU将CS:IP指向的内容当作指令执行。(即PC)

    看明白下面例子即可理解:


    工作原理简述:
    (1) 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
    (2)IP-IP+所读取指令的长度,从而指向下一条指令;
    (3)执行指令。转到步骤(1),重复这个过程。
    在8086CPU .加电启动或复位后(即CPU 刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU 从内存FFFFOH单元中读取指令执行,FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。
    8086CPU提供转移指令修改CS、IP的内容。(记住例子即可)
    • 同时修改CS:IP

      jmp 段地址:偏移地址:用指令中给出的段地址修改CS,偏移地址修改IP。
    • 只修改其中的IP

      jmp 某一合法寄存器:仅修改IP的内容。
    • 不支持单独修改CS
      8086CPU不支持将数据直接送入段寄存器的操作,这属于8086CPU硬件设计。
    参考资料 王爽《汇编语言第三版》,小甲鱼视频,博客分享
    欢迎关注本人微信公众号:那个混子
    记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!

    相关文章

      网友评论

        本文标题:混子汇编语言学习之02笔记

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