定位内存地址


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

[…]

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

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

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

[bx+idata]

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

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

mov al,01100011B
and al,00111011B
(al) = 00100011B

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

mov al,01100011B
or  al,00111011B
(al) = 01111011B

大小写转换

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

字母十六进制二进制
A4101000001
a6101100001
B4201000010
b6201100010

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

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

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

or 字母1,小写字母2
大写字母的0遇到小写字母的1会变为1,最后化为小写
小写字母不会变
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&阿权&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值