• 第三章寄存器(内存访问) 其一


    3.1内存中字的存储

    在0地址处开始存放20000(4E20H)

     0号单元是低地址单元,1号单元是高地址单元

    问题:

    1)0地址单元种存放的字节型数据是多少?

      20H

    2)0地址单元中存放的字型数据是多少?

      4E20H

    3)2地址字单元中存放的字节型数据是多少?

      12H

    4)2地址单元中存放的字型数据是多少?

      0012H

    5)1地址字单元中存放的字型数据是多少?

      124EH

    结论:

    任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。

    3.2  DS和[address]

    CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;

    在8086PC中,内存地址由段地址和偏移地址组成。

    8086CPU有一个DS寄存器,通常用来存放要访问的数据的段地址。

     

    例如:我们要读取的10000H单元的内容可以用如下程序段进行:

    mov  bx,1000H

    mov  ds,  bx

    mov  al,[0]

    上面三条指令将10000H(1000:0)中的数据读到al中。

    从哪个内存单元送到哪个寄存器中呢?

    mov指令的格式:

    mov  寄存器名,内存单元地址

    [...]表示一个内存单元,[...]中的0表示内存单元的偏移地址。

    那么内存单元的段地址是多少呢?

    执行指令时,8086CPU自动取DS中的数据为内存单元的段地址。

    如何用mov指令从10000H中读取数据?

    10000H表示为1000:0

    将段地址1000H放入ds

    用mov  al,[0]完成传送(mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中)

    如何把1000H送入ds?

    传送指令mov   ax,1

    相似的方式   mov   ds,1000H?

    8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。(硬件设计的问题)

    mov  ds,1000H是非法的。

    数据-》一般的寄存器-》段寄存器

    问题:

    将al中的数据送入内存单元10000H

    结论: 

    mov   bx,1000H

    mov  ds,bx

    mov  [0],al

    (一种合理的回答)

    3.3字的传送

    因为8086CPU是16位结构,有16跟数据线,所以,可以一次性传送16位的数据,也就是一次性传送一个字。

    mov  bx,1000H

    mov  ds,bx

    mov  ax,[0]  ;1000:0处的字型数据送入ax

    mov  [0],cx  ;cx中的16位数据送到1000:0处

    3.4    mov、add、sub指令

    已学mov指令的几种形式

    mov   寄存器,数据

    mov   寄存器,   寄存器

    mov   寄存器   ,   内存单元

    mov   内存单元   ,   寄存器

    mov   段寄存器,   寄存器

    mov    寄存器,   段寄存器

    add和sub指令同mov一样,都有两个操作对象

    add和sub不能对段寄存器操作

    3.5  数据段

    前面讲过,对于8086PC机,我们可以根据需要将一组内存单元定义为一个段。

    我们可以将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。

    比如我们用123B0H~123B9H这段空间来存放数据:

    段地址:123BH

    长度:10字节

    如何访问数据段中的数据呢?

    将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。

    我们将123B0H~123BAH的内存单元定义为数据段,我们现在要累加这个数据段中的前3个单元中的数据,代码如下:

    写几条指令,累加数据段中的前3个字型数据

     注意:一个字型数据占两个单元,所以偏移地址是0、2、4

    3.1~3.5  小结

    1)字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。

    2)用mov指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。

    3)[address]表示一个偏移地址为address的内存单元。

    4)在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器对应、低地址单元和低8位寄存器对应。

    5)mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

  • 相关阅读:
    git
    switch切换
    js object 常用方法总结
    pod install速度慢的终极解决方案
    MacBook Pro 初体验
    LINQ以及LINQ to Object 和LINQ to Entities
    WebService/WCF/WebAPI 之间的区别
    owin
    回车和刷新以及Ctr+F5的区别
    ASP.NET Core 启动流程图
  • 原文地址:https://www.cnblogs.com/fate-/p/12853250.html
Copyright © 2020-2023  润新知