8086汇编-23[BX]和Loop指令01

#pragma once
/*    23-[BX]和Loop指令01                

  [bx]和内存单元的描述
    在学习之前要说明一点,我们在编译器 编译后的文件,在Debug 中调试,会发现如 mov ax,[1] 这种代码 直接变成 mov ax,01 了,编译器不支持 [1] 这种格式. 但是Debug 是支持的,所以我们要进行传输偏移地址的话往下看.

    [bx]是什么呢?和[0]有些类似,[0]表示内存单元,它的偏移地址是0。

            mov ax, [0]

            mov al, [0]
    
    我们要完整地描述一个内存单元,需要两种信息:
        (1)内存单元的地址;
        (2)内存单元的长度(类型)。

    我们用[0]表示一个内存单元时,0 表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出,如前边的AX,AL。

    [bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:
        mov ax,[bx]
        mov al,[bx]
            意思就是,我们先把偏移地址传递给bx 寄存器  mov bx,0H ,这样后编译器才会识别到[bx] 是一个段寄存器的偏移地址


  loop
    英文单词“loop”有循环的含义,显然这个指令和循环有关。

    描述性符号“()” 为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号 “() ”来表示一个寄存器或一个内存单元中的内容。

    我们看一下(X)的应用,比如:
        (1)ax中的内容为0010H,我们可以这样来描述:(ax)=0010H;    
        (2)2000:1000 处的内容为0010H,我们可以这样来描述:(21000H)=0010H;
        (3)对于mov ax,[2]的功能,我们可以这样来描述:(ax)=((ds)*16+2);
        (4)对于mov [2],ax 的功能,我们可以这样来描述:((ds)*16+2)=(ax); 
        (5)对于 add ax,2 的功能,我们可以这样来描述:(ax)=(ax)+2;
        (6)对于add ax,bx的功能,我们可以这样来描述:(ax)=(ax)+(bx);
        (7)对于push ax的功能,我们可以这样来描述:  (sp) = (sp)-2
                   ((ss)*16+(sp))=(ax)
        (8)对于pop ax 的功能,我们可以这样来描述:
                   (ax)=((ss)*16+(sp))  
                   (sp)=(sp)+2
            意思就是,以后用(X) 来表示 X 取中的内容,这并不是汇编语法,只是咱们自己做的一个规定 ,利于直观的讲解.

  约定符号idata表示常量
    我们在Debug 中写过类似的指令:mov ax,[0],表示将 ds:0 处的数据送入ax中。指令中,在“[…]”里用一个常量0表示内存单元的偏移地址。以后,我们用idata表示常量。
        例如:
            mov ax,[idata]就代表mov ax,[1]、mov ax,[2]、mov ax,[3]等。

            mov bx,idata就代表mov bx,l、mov bx,2、mov bx,3等。                            

            mov ds,idata就代表mov ds,1、mov ds,2等,它们都是非法指令。 段寄存器 不接收直接的数据赋值.
                
                idata 就是表示 一个数字.

  [bx]
    我们看一看下面指令的功能:

        mov ax,[bx]
          功能:bx 中存放的数据作为一个偏移地址EA ,段地址SA 默认在ds 中,将SA:EA处的数据送入ax中。

          即: (ax)=((ds) *16 +(bx));

    mov [bx],ax 

      功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处。

      即:((ds) *16 +(bx))  =  (ax)

    问题
        程序和内存中的情况如下图所示,写出程序执行后,21000H~21007H 单元中的内容。

        

    分析

        

    assume cs:codesg

    codesg segment

    fishcc:mov    ax,2000H           
           mov    ds,ax
           mov    bx,1000H
           mov    ax,[bx]
           inc    bx
           inc    bx
           mov    [bx],ax
           inc    bx            // inc 指令就是 C语言中的 ++  ,inc bx 相当于  bx = bx+1
           inc    bx
           mov    [bx],ax
           inc    bx
           mov    [bx],al
           inc    bx
           mov    [bx],al        

           mov    ax,4C00H
           int  21H

    codesg ends

    end fishcc

        (1)先看一下程序的前三条指令:
            mov ax,2000H 
            mov ds,ax 
            mov bx,1000H

            这三条指令执行后
              ds=2000H,
              bx=1000H;

        (2)再看第4条指令:
            mov ax,[bx]
                指令执行前:
                   ds=2000H,bx=1000H,则mov ax,[bx]将把内存2000:1000处的字型数据送入ax中。
                该指令执行后:
                   ax=00beH。

        (3)再看第5、6条指令:
                inc bx                // bx 自增1 的意思     inc 全称 InCrement  意思就是增量、增加、增值、增额
                inc bx
            指令执行前:
              bx=1000H。
            执行后:
              bx=1002H

        (4)再看第7条指令:    
             mov [bx],ax
             指令执行前:
               ds=2000H,bx=1002H,则
               mov [bx],ax将把ax中的数据
               送入内存2000:1002处。
             指令执行后:
               2000:1002单元的内容为BE,2000:1003单元的内容为00。


         (5)接下来,第8、9条指令:
            inc bx
            inc bx                    inc指令就是自增1的意思 
            这两条指令执行前bx=1002H,执行后bx=1004H。

         (6)接下来,第10条指令:
            mov [bx] , ax指令执行前: 
                ds=2000H, bx=1004H,则mov [bx],ax将把ax中的数据送入内存2000:1004处。
                指令执行后,2000:1004单元的内容为BE, 2000:1005单元的内容为00。

         (7)接下来,第11条指令:
            inc bx这条指令执行前bx=1004H,执行后bx=1005H。
         
         (8)接下来,第12条指令:
            mov [bx], al指令执行前: ds=2000H, bx=1005H,则mov [bx],al将把al中的数据送入内存2000:1005处。
            指令执行后,2000:1005单元的内容为BE。

         (9)接下来,第13条指令:
            inc bx这条指令执行前bx=1005H,执行后bx=1006H。

         (10)接下来,第14条指令:
            mov [bx], al指令执行前: ds=2000H, bx=1006H,则mov [bx],al将把al中的数据送入内存2000:1006处。
            指令执行后,2000:1006单元的内容为BE。
*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值