汇编-7.1-灵活定位内存地址的方法

1.[bx+idata]
我们用[bx]的方式来指明一个内存单元,还可以用一种更灵活的方式来指明内存单元:[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)。
如:mov ax,[bx+200]
数学化的描述为:(ax)=((ds)*16+(bx)+200)
2.用[bx+idata]的方式进行数组的处理
原来定位字符串的字符:

start: mov ax,datasg
         mov ds,ax           ;设置ds指向datasg

         mov bx,0            ;设置(bx)=0,ds:bx指向'BaSiC'的第一个字母

         mov cx,5            ;设置循环次数5,'BaSiC'有5个字母

     s: mov al,[bx]          ;将ASSII码从ds:bx所指的单元取出
        and al,11011111B;将al中的ASCII码第五位置0,变为大写字母
        mov [bx],al          ;将转变后的ASCII码写回原单元
        inc bx                  ;(bx)加1,ds:bx指向下一个字母
        loop s

        mov bx,5            ;设置(bx)=5,ds:bx指向 'iNfOrMaTiOn'的第一个字母

        mov cx,11           ;设置循环次数11,因为 'iNfOrMaTiOn'有11个字母
    s0:mov al,[bx]
        or al,00100000B  ;将al中的ASCII码的第五位置1,变为小写字母
        mov [bx],al
        inc bx
        loop s0

datasg中的两个字符串,一个起始地址是0,一个起始地址为5;
将两个字符串看作是两个数组,一个从0开始存放,一个从5开始存放。这样就可以用[0+bx],[5+bx]的方式在同一个循环中定位这两个字符串中的字符。0,5给定了两个字符串的起始偏移地址,bx中给出了从起始偏移地址开始的相对地址。
如:
这里写图片描述
或:
这里写图片描述
3.SI和DI
si和di是8086CPU中和bx功能近似的寄存器,si和di不能够分成两个8位寄存器来使用。
4.[bx+si]和[bx+di]
[bx(si或di)]和[bx(si或di)+]可以用来指明一个内存单元。或者更为灵活的方式:[bx+si]和[bx+di]。
如:mov ax,[bx+si](等于mov ax,[bx] [si])
数学化描述为:(ax)=((ds)*16+(bx)+(si))
5.[bx+si+idata]和[bx+di+idata]
[bx+si+idata]和[bx+di+idata]含义近似;
[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata(即bx中的数据值加上si的数值再加上idata).
如:mov ax,[bx+si+idata]
数学描述为:(ax)=((ds)*16+(bx)+(si)+idata)
该指令也可以写成如下格式:
这里写图片描述
6.不同寻址方式的应用
(1).[idata]用一个常量来表示地址,可用于直接定位一个内存单元;
(2).[bx]用一个变量来表示内存的地址,可用于间接定位一个内存单元;
(3).[bx+idata]用一个变量和一个常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
(4).[bx+si]用两个变量表示地址;
(5).[bx+si+idata]用两个变量和一个常量表示地址。

posted @ 2018-07-24 19:02  西贡小傻  Views(114)  Comments(0Edit  收藏  举报