• 汇编 | 数据段寄存器DS和[address]


    Description

    CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器,通常用来存放要访问
    数据的段地址。比如我们要读取10000H单元的内容,可以用如下的程序段进行。


    mov bx,1000H
    mov ds,bx
    mov a1,[0]
    

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

    前面我们使用 mov 指令,可完成两种传送:

    1. 将数据直接送入寄存器;
    2. 将一个寄存器中的内容送入另一个寄存器。

    也可以使用mov指令将一个内存单元中的内容送入一个寄存器中。

    从哪一个内存单元送到哪一个寄存器中呢?在指令中必须指明。寄存器用寄存器名来指明,内存单元则需用内存单元的地址来指明。显然,此时 mov 指令的格式应该是:mov 寄存器名,内存单元地址。

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

    我们知道,只有偏移地址是不能定位一个内存单元的,那么内存单元的段地址是多少呢?

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


    再来看一下,如何用 mov 指令从 (10000H)​ 中读取数据。(10000H) 用段地址和偏移地址表示为(1000:0),我们先将段地址 (1000H) 放入 ds,然后用 mov al,[0] 完成传送。mov 指令中的 [] 说明操作对象是一个内存单元,[]中的 (0)说明这个内存单元的偏移地址是 (0),它的段地址默认放在ds中,指令执行时,8086CPU会自动从 ds 中取出。

    mov bx,1000H
    mov ds,bx
    

    若要用 mov al,[0] 完成数据从 (1000:0) 单元到 al 的传送,这条指令执行时,ds 中的内容应为段地址 (1000H) ,所以在这条指令之前应该将 (1000H)​ 送入 ds

    如何把一个数据送入寄存器呢?我们以前用类似 “mov ax, l” 这样的指令来完成,从理论上讲,我们可以用相似的方式: mov ds, l000H,来将 (1000H) 送入 ds 。可是,现实并非如此,8086CPU不支持将数据直接送入段寄存器的操作,ds 是一个段寄存器,所以 mov ds, l000H 这条指令是非法的。那么如何将 (1000H) 送入 ds 呢?只好用一个寄存器来进行中转,即先将 (1000H) 送入一个一般的寄存器,如 bx ,再将 bx 中的内容送入 ds

    为什么8086CPU不支持将数据直接送入段寄存器的操作?这属于8086CPU硬件设计的问题,我们只要知道这一点就行了。

    问题3.2

    写几条指令,将 al 中的数据送入内存单元 (0000H) 中,思考后看分析。

    分析:

    怎样将数据从寄存器送入内存单元?

    从内存单元到寄存器的格式是:"mov寄存器名,内存单元地址”,

    从寄存器到内存单元则是:"mov内存单元地址,寄存器名”。

    (10000H) 可表示为 (1000:0) ,用 ds 存放段地址 (1000H) ,偏移地址是 (0),则 mov [0],al 可完成从 al(10000H) 的数据传送。完整的几条指令是:

    mov bx, 1000H
    mov ds, bx
    mov [0],a1
    

    段寄存器扩展汇总

    1. 在8086CPU中,使用 (16) 位寄存器来存储一个字(word). 高 (8) 位存放高位字节,低 (8) 位存放低位字节。

    在内存中存储时,由于内存单元是字节单元,则一个字(word)需要用 (2) 个地址连续的内存单元来存放 。
    这个字(word)的低位字节存放在低地址单元中,高位字节存放在高地址单元中。

    2. 我们将起始地址为 (N) 的字单元简称为 (N) 地址字单元 。

    如:一个字单元由 (2、3) 两个内存单元组成,则这个字单元的起始地址为 (2) ,我们可以说这是:(2) 地址字单元 。

    3. 字节单元与字单元。

    一个内存单元可以存储 (1) 个字节数据(byte), 相当于 (8)位(bit)数据。称为"字节单元"。
    一个字单元,大家知道,一个字(word)等于 (2) 个字节(byte), 所以
    一个字单元,需要 (2) 个地址连续的字节单元存放。
    字的低字节位放在低地址字节单元中,字的高字节位放在高地址字节单元中。

    4. CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成。

    8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。
    如:我们要读取 (10000H) 单元的内容。

    则:

    mov bx, 1000H
    mov ds, bx
    mov al, [0]
    

    mov 指令也可以将一个内存单元中的内容送入一个寄存器中。[...]表示一个内存单元。[...]中的0表示内存单元的偏移地址。
    指令执行时,8086CPU自动取DS寄存器中的数据为内存单元的段地址。

    5. 8086CPU不支持将数据直接送入段寄存器的操作 ,DS是一个段寄存器,所以 mov ds, 1000H是非法的指令 。

    可以用一个寄存器来中转,如:

    mov bx, 1000H
    mov ds, bx
    

    6. 字的传送

    因为8086CPU是 (16) 位结构,有 (16) 根数据线,所以一次性可以传送 (16) 位的数据,也就是说,一次性可以传送一个字(word).
    只要mov指令中给出 (16) 位寄存器就可以进行 (16) 位数据的传送了。如:

    mov bx, 1000H
    mov ds, bx
    mov ax, [0]       ; 1000:0 处的字形数据送入AX寄存器中
    mov [0], cx       ; cx寄存器中的16位数据送到1000:0处
    

    6. 例子

    内存情况, 如下所示,写出下面指令执行后寄存器 (AX、BX、CX) 中的值。

    10000H    23H
    10001H    11H
    10002H    22H
    10003h    66H
    

    mov ax, 1000H  
    mov ds, ax  
    mov ax, [0]  
    mov bx, [2]  
    mov cx, [1]  
    add bx, [1]  
    add cx, [2]  
    

    解析:

    mov ax, 1000H
    mov ds, ax
    

    上面2条指令,将DS寄存器设置为 (1000H) (代码段地址)

    mov ax, [0] 由于AX是16位寄存器,所以需要把字型数据送入AX

    (1000:0)​ 内存单元中存储着字型数据的低 (8)​ 位,(23H)
    (1000:1)​ 内存单元中存储着字形数据的高 (8)​ 位,(11H)
    指令执行时,字型数据的高 (8)​ 位送入AH,字形数据的低 (8) 位送入AL,则AX寄存器的值为 (1123H)

    后面的原理相同。

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    3D切割轮播图
    网站公共部分的复用
    Git的安装及布置
    完整轮播图
    百度检索例子
    第五章 pycharm编辑器安装和使用
    第四章 散列类型的方法
    第一章 认识爬虫以及环境安装
    主机访问Ubuntu虚拟机的jupyter
    12306购票的testerSunshine带源码刷票
  • 原文地址:https://www.cnblogs.com/RioTian/p/15364360.html
Copyright © 2020-2023  润新知