8086汇编-15寄存器(内存访问)03

#pragma once
/* 15-寄存器(内存访问)03

  mov、add、sub指令
    已学mov指令的几种形式:
         mov 寄存器,数据      例如: mov ax,6
         mov 寄存器,寄存器     例如: mov ax,bx
         mov 寄存器,内存单元  例如: mov ax,[0]
         mov 内存单元,寄存器  例如: mov [0],ax  
         mov 段寄存器,寄存器  例如: mov ds,ax
       老生常谈,段寄存器是无法直接送入数据的,需要通过其他寄存器才能向段寄存器中送入数据.

    根据已知指令进行推测
        mov 段寄存器,寄存器
                     mov 寄存器,段寄存器(验证)

        mov 内存单元,寄存器
                     mov 内存单元,段寄存器
                     mov 段寄存器,内存单元

    验证    
        mov 段寄存器,寄存器
               mov 寄存器,段寄存器            发现是可以进行赋值,发现是可行的,我们要知道,如果有一些实在不懂的地方,一定要自己动手去认证.
    


    add和sub指令同mov一样,都有两个操作对象。
        add 寄存器,数据                比如:add ax,8
        add 寄存器,寄存器            比如:add ax,bx
        add 寄存器,内存单元            比如:add ax,[0]                这里我要再次说明一次, ax 十六位寄存器,能存放十六位也就是2个字或者说 1个字 的数据,超过位数的数据高位会被暂时丢弃.
        add 内存单元,寄存器            比如:add [0],ax                但是这里 向内存中 直接存放数据,就和上面说的不同了,向内存中直接放数据 就是有多少放多少.[0] 只是说明 数据的最低位放在这,也就是开始的地方.
        sub 寄存器,数据                比如:sub ax,9
        sub 寄存器,寄存器            比如:sub ax,bx
        sub 寄存器,内存单元            比如:sub ax,[0]
        sub 内存单元,寄存器            比如:sub [0],ax

    它们可以对段寄存器进行操作吗?
        (请自行在Debug中试验) 比如: add ds,ax   答案是不可以的.说明了段寄存的值 只能通过, mov 段寄存器,寄存器 来改变

        
  数据段
    前面讲过,对于8086PC机,我们可以根据需要将一组内存单元定义为一个段(可以是代码段、数据段等)。意思就是在同一个内存,我们用ds 指定它,并且用[] 偏移的方式调用,CPU就认为这是一块数据地址,,如果用cs:ip来指
定它,那么CPU 就会认为这是下一个执行地址,如果什么都没有指定, 那就是一个纯纯的数据.


    我们可以将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。 所以说一个段内存的空间大小最大也就是16位(64K)内存了,当然如果你的程序是32的就
另算.

    比如我们用123B0H~123B9H这段空间来存放数据:
        段地址:123BH
        长度:10字节      用123B:9 表示

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

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

    示例:
        我们将123B0H~123BAH的内存单元定义为数据段,我们现在要累加这个数据段中的前3个单元中的数据,代码如下:
            mov ax,123BH
            mov ds,ax                ;将123BH 送入ds中,作为数据段的段地址
            mov al,0                ;用al存放累加的结果
            add    al,[0]                ;将数据段第一个单元(偏移地址为0)中的数据值加到al中
            add al,[1]                ;将数据段第二个单元(偏移地址为1)中的数据值加到al中
            add al,[2]                ;将数据段第三个单元(偏移地址位2)中的数据值加到al中

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

        思考后看分析。

            mov ax,123BH
            mov ds,ax                ;将123BH 送入ds中,作为数据段的段地址
            mov ax,0                ;用ax存放累加的结果
            add    ax,[0]                ;将数据段第一个字(偏移地址为0)中的数据值加到ax中
            add ax,[2]                ;将数据段第二个字(偏移地址为2)中的数据值加到ax中
            add ax,[4]                ;将数据段第三个字(偏移地址位4)中的数据值加到ax中
                注意:一个字型数据占两个单元,所以偏移地址是0、2、4。
  
  小结
    (1)字在内存中存储时 ,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放再高地址单元中。

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

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

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

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

    (6)可以根据自己的推测,在Debug中实验指令的新格式。


  检测点
    (1)在Debug 中,用指令"d 0:0 1f" 查看内存,结果如下
        0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
        0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
      下面的程序执行前,AX = 0,BX = 0,写出每条汇编指令执行完成后相关寄存器中的值。

          mov ax,1                                                答案
          mov ds,ax
          mov ax,[0000]                        AX=________?        2662H    
          mov bx,[0001]                        BX=________?        E626H
          mov ax,bx                            AX=________?        E626H
          mov ax,[0000]                        AX=________?        2662H
          mov bx,[0002]                        BX=________?        D6E6H
          add ax,bx                            AX=________?        FD48H    
          add ax,[0004]                        AX=________?        2C14H
          mov ax,0                            AX=________?        0H
          mov al,[0002]                        AX=________?        00E6H
          mov bx,0                            BX=________?        0
          mov bl,[000C]                        BX=________?        0026H
          add al,bl                            AX=________?        000CH    
            提示注意ds 的值

    
    (2)内存中的情况如图所示。


        各项寄存器的初始值:CS = 2000H,IP = 0,DS = 1000H ,AX = 0 ,BX = 0;
        (1) 写出CPU 执行的指令顺序(用汇编指令写出)
        (2) 写出CPU 执行每条指令后,CS、IP和相关寄存器中的数值
        (3) 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
        答案:
           (1-2):mov ax,6622h        CS == 2000H   IP = 0003H
                 jmp 0ff0:0100        CS == 2000H      IP = 0008H    执行完jmp 后  CS == 0ff0H    IP == 0100H
                 mov ax,2000H        CS == 1000H      IP = 0003H
                 mov ds,ax            CS == 1000H      IP = 0005H
                 mov ax,[0008]        CS == 1000H      IP = 0008H
                 mov ax,[0002]        CS == 1000H      IP = 000BH
           (3)    CS是指令 DS是数据
*/        

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值