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

前言

最近学了王爽教授写的《汇编语言》,整理一下学习笔记。

7.1 and和or指令

and指令

and逻辑与指令,按位进行与运算。除非两边都为1,否则为0。例如:

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

or指令

or逻辑或指令,按位进行或运算。除非两边都为0,否则为1。例如:

mov al,01100011B
or al,00111011B

执行后:al = 01111011B

7.2 以字符形式给出的数据

关于ASCll码

ASCII 大家应该都了解过吧,其实就是一种编码方案,约定了用什么样的信息来表示什么样的对象,比如,用61H表示“ a ”,62H表示“ b ”。

一个文本的编辑过程中,就包含着按照ASCll编码规则进行的编码和解码。在编辑文本的过程中,我们按下键盘的a键,就会在屏幕上看到“ a ”,这个按键的信息被送入计算机,计算机用ASCll码的规则对其进行编码,将其转化为61H存储在内存的指定空间中;文本编辑软件从内存中取出61H,将其送到显卡上的显存中;工作在文本模式下的显卡,用ASCll码的规则解释显存中的内容,61H被当作字符“ a ”,显卡驱动显示器,将字符“ a ”的图像画在屏幕上。

字符

在汇编程序中,用 ‘…’ 的方式指明数据是以字符的形式给出的,编译器将它们转化成相对应得ASCll码。比如下面得程序:
p71
上面程序中:
“ db ‘unIX’ ” 相当于 “db 75H,6EH,49H,58H”,“u”,“n”,“I”,“X”的ASCll码分别为75H、6EH、49H、58H
“ db ‘foRK’ ” 相当于 “db 66H,6FH,52H,4BH” , “f”,“o”,“R”,“K”的ASCll码分别为66H、6FH、52H、4BH
“ mov al, ‘a’ ” 相当于 “mov al,61H”,“a”的ASCll码为61H
“ mov bl, ‘b’ ” 相当于 “mov al,62H”,“b”的ASCll码为62H

大小写转换的问题

我们来看一张图片对比一下字母的大小写,从中找出变换的规律:
ASCll码的字母大小写
我们可以看出
在十六进制中,将小写字母加上“20H”就可以得到它的大写字母,将大写字母加上“20H”就可以得到它的小写字母。
在二进制中,将小写字母第5位的0变成1就可以得到它的大写字母,将小写字母第5位的0变成1就可以得到它的大写字母。

我们可以通过and al,11011111B这种方式将小写字母转变为大写字母,通过or al,00100000B这种方式将大写字母转变为小写字母。

比如将“BaSiC”中的小写字母变成大写,将“iNfOrMaTiOn”中的大写字母变成小写,我们可以用如下程序来实现:

程序

7.3 不同寻址方式的灵活运用

[bx+idata]

我们之前一直是用 [bx] 的方式来指明一个内存单元,还可以用更为灵活的方式:[bx+idata],它的偏移地址为 (bx)+idata,比如:

汇编指令:mov ax, [bx+10]
数字化描述:(ax) = ((ds)*16+bx+10)

同时,该指令也可以写成如下形式:
mov ax, 200[bx]
mov ax, [bx].200

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

先看这个问题,在codesg中填写代码,将datasg中定义的第一个字符串转化为大写,第二个字符串转化为小写。完整代码如下:

在这里插入图片描述
对于上面codesg段的程序,如果用C语言来描述,大致是这样的:
在这里插入图片描述

从中我们可以发现上面C程序和汇编程序在定位字符串中字符的相似之处:

C语言:a[i], b[i]
汇编语言:0[bx], 5[bx]

SI和DI

si和di是8086CPU中和bx功能相近的寄存器,但是si和di不能够分成两个8位寄存器来使用

同样,si和di的使用有以下几种形式:
[bx+si]
[bx+di]
[bx+si+idata]
[bx+di+idata]

关于二重循环的问题

下面来看一个问题:
在datasg中定义了4个字符串,每个长度为16个字节,将datasg段中每个单词改写为大写字母

在这里插入图片描述
现在分析一下问题,我们可以把这4个字符串看成一个4行16列的二维数组,按照要求,我们只修改二维数组每一行的前三列即可。因此,我们要进行4x3次的二重循环,即一行一行修改,先进行内循环,再进行列循环

代码如下:

在这里插入图片描述
我们看上面的代码再来深入思考一个问题,上面的程序中我们用dx来暂时存放cx的值,但如果在内层循环中,dx寄存器被占用了,该怎么办?用别的寄存器吗,但寄存器的数量是有限的,这似乎是一个不靠谱的方案,所以我们可以用内存单元来暂时存储数据

在这里插入图片描述
但是我们再想一想,如果需要保存多个数据的话,我们必须记住数据都存在了哪个单元中,这样的话程序就容易混乱,而要使我们的程序更加清晰,我们一般用栈来暂时存储数据,这需要我们定义一个栈段来进行具体的操作,详细操作不再赘述。

总结

以上为本人学习汇编语言时的摘录总结,主要内容来源于汇编语言(第四版) 王爽 著,大家若是感兴趣可以看看原书,很值得推荐,以上内容如果有什么错误的话,还请大家指正!

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拉马努金的小石头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值