《汇编语言》第七章 更灵活的定位内存地址的方法

7.1 and 和 or 指令

and指令:逻辑与指令,按位进行与运算

mov al,01100011B
and al,00111011B
执行结果:
al = 00100011B

通过该指令可将操作对象的相应位设为0,其它位不变

or指令:逻辑或指令,按位进行或运算

mov al,01100011B
or  al,00111011B
执行结果:
al = 01111011B

通过该指令可将操作对象的相应位设为1,其它位不变

7.2 关于ASCII码

计算机中所有的信息都是二进制,而人能理解的信息是具有约定意义的字符

如果将123,desk,BASIC这些信息存储在计算机里,就要对其进行编码,将其转化为二进制信息进行存储,而计算机要将这些信息再显示给我们看,就要再对其进行解码,只要编码和解码采用同样的规则,我们就能将人能理解的信息存入到计算机,再从计算机中取出

所谓编码方案,就是一套规则,它约定了用什么信息来表示现实对象

在文本编辑的过程中,当我们按下a时,就会在屏幕上显示a,这个过程具体实现是:
按下a时,这个按键的信息被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化成61H存储在内存的指定空间中,文本编辑器从内存中取出61H,将其送到显卡的显存中,工作在文本模式下的显卡,用ASCII码的规则解释显存中的内容,61H被当作字符a,显卡驱动显示器,将字符a的图像画在屏幕上

7.3 以字符形式给出的数据

在汇编中,以’ '的方式指明数据是以字符的形式给出的,编译器将它们转化为相对应的ASCII码
在这里插入图片描述
上面程序中,db 'unIx’相当于 db 75H,6EH,49H,58H,四个16位数对应着u,n,I,X,db用来定义字符或字符串

7.4 大小写转换的问题

考虑将下面程序第一个字符串转化为大写,第二个字符串转化为小写

assume cs:code,ds:data

data segment
	db 'BaSiC'
	db 'iNfOrMaTiOn'
data ends

code segment
start:
code ends
end start

我们知道同一个字母的大写字符和小写字符相对应的ASCII码是不同的,如’A’的ASCII码是41H,'a’的ASCII码值是61H,要改变一个字母的大小写,其实就是改变它所对应的ASCII码

小写字母的ASCII码比大写字母的ASCII码值大20H,将’a’的ASCII码值减20就可以得到 ‘A’,为了完成需要,程序必须能判断一个字母是大写还是小写,需要一条判断指令,但此处还未涉及到,从另一角度考虑

就ASCII码的二进制来看,除第5位(从右向左,从0开始)外,大写字母和小写字母的其它位都一样,大写字母ASCII码的第五位为0,小写字母ASCII码第5位为1,这样,一个字母,不管它原来是大写还是小写,将它的第五位置1就是小写,置0就是大写,利用and和or来进行位运算

在这里插入图片描述

7.5 [bx+idata]

前面可以使用[bx]的方式来指明一个内存单元,还可以使用一种更灵活的方式来指明一个内存单元:[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
如:mov ax,[bx+200]:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值+200,段地址在ds中,即(ax)=((ds)*16+(bx)+200)

7.6 用[bx+idata]的方式进行数组的处理

将下列demo中data段内第一个字符串转化为大写,第二个字符串转化为小写

assume cs:code,ds:data

data segment
	db 'BaSiC'
	db 'MinIX'
data ends

code segment
start:
code ends
end start

使用[data+idata]的方式,将着两个字符串看作两个数组,一个从0开始存放,一个从5开始存放,那么可以用[0+bx]和[5+bx]的方式在同一个循环中定位这两个字符串中的字符

在这里插入图片描述
[bx+idata]的方式为高级语言实现数组提供了便利机制

7.7 SI 和 DI

si和di是8086CPU中和bx功能相近的寄存器,但si和bi不能分成两个8位寄存器来使用
下面3组指令实现了同样的功能:

mov bx,0
mov ax,[bx]

mov si,0
mov ax,[si]

mov di,0
mov ax,[di]

7.8 [bx+si] 和 [bx+di]

前面有用过 [bx(si/di)] 和 [bx(si/di)+idata]的方式来指明一个内存单元,还可以采用更灵活的方式:[bx+si] 和 [bx+di]

指令mov ax,[bx+si]含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中
即 (ax)=((ds)*16+(bx)+(si))

7.9 [bx+si+idata]和[bx+di+idata]

mov ax,[bx+si+idata]含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中
即(ax)=((ds)*16+(bx)+(si)+(idata))

7.10 不同的寻址方式的灵活应用

[idata]用一个常量表示地址,可用于直接定位一个内存单元
[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元
[bx+idata]用一个变量和一个常量表示地址,可以在一个起始地址的基础上用变量间接定位一个内存单元
[bx+si]用两个变量表示地址
[bx+si+idata]用两个变量和一个常量表示地址

通过灵活的方式来定位一个内存单元的地址,我们可以从更加结构化的角度来看待所要处理的数据

一般来说,在需要暂存数据的时候,都应该使用栈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值