• 汇编学习笔记4


    第三讲讲的是寄存器,第四讲仍然介绍寄存器。

    在第三讲里,介绍了8086,8088CPU共有14个16位寄存器,8个8进制寄存器,分别为16位数据寄存器AX,BX,CX,DX,8位寄存器AH,AL,BH,BL,CH,CL,DH,DL等,指针寄存器BP,SP等,变址寄存器SI,DI等以上八个16位寄存器称为通为寄存器,还有四个段寄存器CS,DS,ES,SS,两个控制寄存器IP,FLAG。

    作为如下:

    AX,AL 被称为累加器,用于累加运算时。BX基址寄存器。CX用于控制循环的次数。CL用于保存移位时的偏移位数。DX用于32位乘除法时保存被除数或保存余数。

    BP栈顶指针寄存器,SP堆栈指针寄存器。SI源变址寄存器,DI目的地址寄存器。CS代码段,DS数据段,ES附加段,SS堆栈段。IP记录下一条要执行的指令的偏移。FLAG标记寄存器,用一个16位数表示一组9个标记。

    结果标识:

    CF,进位标识。AF,附助进位标识。ZF,零标识。PF,奇偶标识。SF,符号标识。OF,溢出标识。

    控制标识:

    DF,方向标识。IF,中断标识。SF,单步标识。

    以上部分内容视频中反复强调,故再复习一次。

    存储器中的地址和数据,

    寄存器中的地址的形成:

    寄存器以字节为单位存储数据,使用16位二进制数来表示每个存储单元。故可表示65536个存储单元。0~FFFFH。存储单元的内容指存放在存储单元中的数据。

    字单元采用高高低低的原则存入存储器的相邻两个字节单元,高位存放高字节,低位存放低字节。双字等与之相同。

    而8086,8088CPU的总线为20根,共有2^20存储空间即1M字节存储单元,可用20位二进制数来表示。而寄存器只能表示64K个存储单元,解决这个问题的方法是存储器分段。

    将存储器分段,每段的长度为64K,段内的地址可使用16位二进制数来表示。而段的地址使用段的起始地址。对每段的起始地址,必须是存储器中任一小段的起始地址。存储器内从0地址开始,每16个字节为一小段。

      00000H   00001H    00002H    00003H    ……    0000DH    0000EH    0000FH

      00010H   00011H    00012H    00013H    ……    0001DH    0001EH    0001FH

      FFFE0H    FFFE1H     FFFE2H    FFFE3H    ……    FFFEDH    FFFEEH    FFFEFH

      FFFF0H    FFFF1H     FFFF2H    FFFF3H    ……     FFFFDH    FFFFEH    FFFFFH

    故每一段的地址的后四位都必然为0。

    存储器中每个存储单元都可以使用一个唯一的20位二进制数来表示,即为该存储单元的物理地址。

    存储单元可以使用存储单元所在的段地址和在该段中的偏移来表示,即为该存储单元的逻辑地址。一个存储单元的逻辑地址表示为 段值 : 偏移。该段的地址为 段值 * 2^4。

    于是每个存储单元的物理地址 = 段值 * 2^4 + 偏移。例如: 230E : 3321H 的物理地址为: 230E0 + 3321 = 26411H。

    段可相连,不相连,重叠。

    段地址和偏移可直接使用16位二进制数来表示,也可使用寄存器指针来表示。

    CS与IP寄存器一起使用,取指令时自动引用代码段和IP寄存器确定指令位置。

    堆栈操作使用SS和SP。SS也可和BP一起使用。

    这一讲内容有些多,记不太清楚,写得有些零碎。这两讲多为概念性的东西。后在以后用到的时候加深记忆。

  • 相关阅读:
    project euler 开坑
    hdu 5382 GCD?LCM!
    Leetcode 557. 反转字符串中的单词 III
    Leetcode 344. 反转字符串
    Leetcode 345. 反转字符串中的元音字母
    008.C++类改写模板类
    007.C++构造函数
    006.C++头文件
    02.树的序列化与反序列化(C++)
    Leetcode 94. 二叉树的中序遍历
  • 原文地址:https://www.cnblogs.com/hailong/p/1891466.html
Copyright © 2020-2023  润新知