注意:只有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 | mov al,01100011B |
or:逻辑或,只要有一个1结果就为1
1 | mov al,01100011B |
大小写转换
首先我们观察一下大小写字母对应的二进制
字母 | 十六进制 | 二进制 |
---|---|---|
A | 41 | 01000001 |
a | 61 | 01100001 |
B | 42 | 01000010 |
b | 62 | 01100010 |
这里我们可以发现大小写字母二进制仅有几位不同,此时结合and和or指令
当我们要将所有字母转化为大写字母时,我们将字符与大写取逻辑与(and),
1 | and 字母1,大写字母2 |
当我们要将所有字母转化为小写字母时,我们将所有字符与小写取逻辑或
1 | or 字母1,小写字母2 |