汇编-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]用两个变量和一个常量表示地址。