7.5 [bx+idata]
例如我们要访问地址[10H], 可以进行如下变换:
$$[bx=10H]=[bx=8H+2H]$$
[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata (bx中的数值加上idata)。
将这种操作代入指令中,如mov ax, [bx+200],含义为:
$$(ax)=((ds)*16+(bx)+200)$$
[bx+idata]的形式有多种方法,如下等同:
- mov ax, [200+bx]
- mov ax, 200[bx]
- mov ax, [bx].200
7.6 用[bx+idata]的方式进行数组的处理
首先复习一下上一篇博客中大小写字母转化的代码(非常重要):
assume cs:codesg, ds:datasg datasg segment db 'BaSiC' db 'MinIX' datasg ends
codesg segment start: mov ax, datasg mov ds, ax
mov bx, 0 mov cx, 5 s: mov al, ds:[bx] and al, 11011111b mov ds:[bx], al inc bx loop s mov bx, 5 mov cx, 5 s0: mov al, ds:[bx] or al, 00100000b mov ds:[bx], al inc bx loop s0
mov ax, 4c00h int 21h
codesg ends end start
|
利用[bx+idata]的方法对代码进行优化:
assume cs:codesg, ds:datasg datasg segment db 'BaSiC' db 'MinIX' datasg ends
codesg segment start: mov ax, datasg mov ds, ax
mov bx, 0 mov cx, 5 s: mov al, ds:[bx] and al, 11011111b mov ds:[bx], al
mov al, ds:[bx+5] or al, 00100000b mov ds:[bx+5], al
inc bx loop s
codesg ends end start
|
这里注意以下关系,并可以基于此对代码进行改写,代码完全等效:
$$0[bx]=[bx]=[bx].0=[bx+0]=[0+bx]$$
在C语言中也存在着相同的处理方式,如下代码:
char a[5]="BaSiC"; char b[5]="MinIX";
main() { int i; i=0; do { a[i]=a[i]&0xDF; b[i]=b[i]|0x20; i++; } while(i<5); }
|
其中,&含义与and相同,|含义与or相同。
C语言:a[i], b[i]
汇编语言:0[bx], 5[bx]
通过比较,我们可以发现,**[bx+idata]的方式为高级语言实现数组提供了便利机制**。