【汇编】更灵活的定位内存地址方式——and,or命令、SI、DI变址寄存器、直接寻址[idata]、寄存器间接寻址[bx]、寄存器相对寻址[bx+idata]、基址变址寻址、相对基址变址寻址

7.1 and和or命令

db ‘.......’方式给出字符串,并将其以ASCII码的对应形式写入内存中
在ASCII码中大小写同字母之间相差32个序号,所以可以通过与11011111b即二进制的数据,来转换大写或00100000b来转换小写。即加减32位的数值变换大小写。
在这里插入图片描述

解决大小写转换问题

大小写转换要通过初始化bx和循环次数,在循环中通过与或操作进行大小写转换。
在这里插入图片描述

代码如下:
通过两次循环实现大小写转换

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,[bx]
	and al,11011111b
	mov [bx],al
	inc bx
	loop s
	mov bx,5
	mov cx,5
s0:	mov al,[bx]
	or al,00100000b
	mov [bx],al
	inc bx
	loop s0

	mov ax,4C00H
	int 21H

codesg ends

end start

在这里插入图片描述

[bx+idata]的含义

在这里插入图片描述

通过单次循环[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,[bx]
	and al,11011111b
	mov [bx],al
	mov al,[bx+5]
	or al,00100000b
	mov [bx+5],al
	inc bx
	loop s

	mov ax,4C00H
	int 21H

codesg ends

end start

在这里插入图片描述

7.2 SI和DI

SI,DI称为变址寄存器。
其特点就是不能分为两个八位寄存器来使用。一直都是16位。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

[bx+si]和[bx+di]方式指定地址(基址+变址寻址)

在这里插入图片描述
在这里插入图片描述

[bx+si+idata]和[bx+di+idata]方式指定地址

在这里插入图片描述
在这里插入图片描述

不同寻址方式的灵活运用

直接寻址:通过一个常量数字来表示一个地址。
寄存器间接寻址:用一个变量[bx]表示偏移地址,存入寄存器中再传给ax
寄存器相对寻址:通过用一个起始地址的常量[idata]来加上变量[bx]来间接表示内存单元。
基址变址寻址:用两个 变量[bx+si] 表示地址。
相对基址变址寻址:用
两个变量[bx+si]一个 常量[idata]
来表示地址。
在这里插入图片描述
在这里插入图片描述

assume cs:codesg,ds:datasg
datasg segment
	db '1. file         '
	db '2. edit         '
	db '3. search       '
	db '4. view         '
	db '5. options      '
datasg ends

codesg segment
start:
	mov ax,datasg
	mov ds,ax
	mov bx,0
	mov cx,5
s:	mov al,[bx+3]
	and al,11011111b
	mov [bx+3],al
	add bx,16
	loop s

	mov ax,4C00H
	int 21H

codesg ends

end start

在这里插入图片描述

在这里插入图片描述
上面这段代码有个问题,那就是cx只有一个,到第二个循环内出来时,cx已经变为0了,那再出外层循环时,cx不是成为负数了么?我们要怎么改进呢?
我们可以通过一个多余的寄存器dx来保存在这里插入图片描述
但是如果dx已经被用了呢?寄存器可是只有14个。
相对而言我们可以用固定的内存空间保存数据,这样相较而言比占用宝贵的寄存器资源要更加划算,但是这样也有一个新问题,那就是如果当时内存空间有别的内容,可能最终会改变别的功能,造成一些后果。
再改进的话我们可以在程序运行前先定义一个栈段,把需要用到的cx的值压到栈段中,用到的时候将其弹出,回复cx。
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

webfker from 0 to 1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值