8086汇编-13~14寄存器(内存访问)01~02

#pragma once
/* 13-寄存器(内存访问)01
  内存中字的存储
    在0地址处开始存放20000 十进制数据(4E20H):
      低位    地址    内容
            0        20H
            1        4EH
            2        12H
            3        00H
            4
      高位    5
    注意:0号单元是低地址单元,1号单元是高地址单元。
        
    问题:
        (1)0地址单元中存放的字节型数据是多少?    20H
        (2)0地址字单元中存放的字型数据是多少?    4E20H
        (3)2地址字单元中存放的字节型数据是多少?    12H
        (4)2地址单元中存放的字型数据是多少?      0012H     
        (5)1地址字单元中存放的字型数据是多少?    124EH

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

  DS和[address]                  [address] 代表的是偏移地址,被[] 括起来的都是地址.  DS == 数据段寄存器
    CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;

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

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

    例如:我们要读取10000H单元的内容可以用如下程序段进行:
          mov bx,1000H
          mov ds,bx
          mov al,[0]            bx == 1000H == ds , al == ds:0  

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

    已知的mov指令可完成的两种传送功能:

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

      除此之外,mov 指令 还可以将一个内存单元中的内容送入一个寄存器。 就是 mov al,[0] 这样,意思就是 将 内存 0:0 地址中的数据值,送入al 寄存器中 , 这个时候ds == 0000,而[0] 就是ds 的偏移

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

    mov指令的格式:
          mov 寄存器名,内存单元地址

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

    那么内存单元的段地址是多少呢? 就是 ds 寄存器!!

    执行指令时,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     (一种合理的回答)


  字的传送
    因为8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是一次性传送一个字。比如:
        mov bx,1000H
        mov ds,bx
        mov ax,[0]                    ; 1000:0 处的字型数据送入ax  ,为什么这里说的是 字呢? 因为 ax 就是16位的寄存器呀,我们向这个寄存器发送数据也得发送匹配的16位数据,16位就是一个字.
        mov [0],cx                    ; cx中的16位数据送到1000:0 处  把高位放到 1000:1 ,把低位放到 1000:1

    内存中的情况如下,写出下面指令执行后寄存器ax,bx,cx中的值。
        mov ax,1000H                     内存情况示意:    地址        值
        mov ds,ax                                         10000H        23
        mov ax,[0]                                          10001H        11
        mov bx,[2]                                        10002H        22
        mov cx,[1]                                        10003H        66
        add bx,[1]              这里也要注意.因为bx 是16位寄存器,所以与其做add 运算的另一个数据也必须是 16位的,高位有就补上,没有就补0, 就和古时候娶亲一样,要门当户对!!! 
        add cx,[2]
        
        ax == 1123  bx == 8833     cx == 8833  为什么会得到这个数据??? 不应该是 ax == 23  这种数据吗??? 因为我们上面学习了 字 的因素啊,ax 寄存器是 十六位的,向它传递值也要进行十六位的补全!!!如果高位无法补
全,那么就用0进行补全,只是有时候调试器没有显示而已.

    思考后请看慢慢分析。(单步跟踪)
        
    内存中的情况如下,写出下面指令执行后寄存器ax,bx,cx中的值。
        mov ax,1000H                     内存情况示意:    地址        值
        mov ds,ax                                         10000H        23        34
        mov ax,11316  这里没有H,是十进制哦 2C34              10001H        11        2C
        mov [0],ax                                        10002H        22        12
        mov bx,[0]                                        10003H        11        1B
        sub bx,[2]            bx = bx - ds:[2]
        mov [2],bx            

        ax == 2C34  bx == 1B12    cx ==   没有 cx啥事啊...

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值