注意:只有bx,bp,si,di可以用在[….]中!!!!

[…]

最基础的我们表示一个地址的方法是DS:[…]

1
mov ax,[100];将DS:[100]的数据送入ax中

这里我们使用了一个准确的地址,但是我们在程序中并不能确保在每个不同的平台运行都是该地址,所以我们需要采用一些其他的表示方法,保证我们的程序的可移植性

[bx+idata]

这里我们假设一个程序的入口地址存放在bx中,而我们需要使用的数据距离入口地址为idata(偏移量),由于在不同的系统,入口地址会有所不同,于是我们采用第一种方法就无法表示了.这里我们使用bx+idata的形式表示:

1
mov ax,[bx+100]

同样如果我们要处理一组数据,我们可以采用c语言数组中的知识,将bx中存入数据起始地址,idata偏移量表示下标.

SI和DI寄存器

当我们在移动复制数据时,我们需要记录源地址和目标地址,此时这两个寄存器就可以完成.
我们用ds:[si]表示源地址的起始地址,ds:[DI]表示目标地址的起始地址,当我们操作一个字符时,SI和DI寄存器同时增加再操作下一个字符.
同样我们也可以使用ds:[bx+SI]或者ds:[bx+DI].

寻址总结

这里不得不提起bilibili上一个视频的表格,对于寻址来说我们记住这个表格就差不多了

表示方法 名称 意义 表示
[idata] 直接寻址 使用一个准确的地址 mov ax,[100]
[bx] 寄存器寻址 间接寻址 mov ax,[bx]
[bx+idata] 寄存器相对寻址 起始地址加偏移量 mov ax,[bx+100]
[bx+si] 基址变址 mov ax,[bx+si]
[bx+si+idata] 相对基址变址 mox ax,[bx+si+idata]

相对地址使得程序可移植,可以运行在不同的环境中.

and和or指令

and:逻辑与,只有同为1结果才为1

1
2
3
mov al,01100011B
and al,00111011B
(al) = 00100011B

or:逻辑或,只要有一个1结果就为1

1
2
3
mov al,01100011B
or al,00111011B
(al) = 01111011B

大小写转换

首先我们观察一下大小写字母对应的二进制

字母 十六进制 二进制
A 41 01000001
a 61 01100001
B 42 01000010
b 62 01100010

这里我们可以发现大小写字母二进制仅有几位不同,此时结合and和or指令
当我们要将所有字母转化为大写字母时,我们将字符与大写取逻辑与(and),

1
2
3
and 字母1,大写字母2
小写字母的1遇到大写字母的0会变为0,最后化为大写,
大写字母不会变

当我们要将所有字母转化为小写字母时,我们将所有字符与小写取逻辑或

1
2
3
or 字母1,小写字母2
大写字母的0遇到小写字母的1会变为1,最后化为小写
小写字母不会变