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

 

 

前言

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

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码。比如下面得程序:

上面程序中:
“ 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

大小写转换的问题

我们来看一张图片对比一下字母的大小写,从中找出变换的规律:

我们可以看出
在十六进制中,将小写字母加上“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寄存器被占用了,该怎么办?用别的寄存器吗,但寄存器的数量是有限的,这似乎是一个不靠谱的方案,所以我们可以用内存单元来暂时存储数据

 

 

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

总结

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


__EOF__

本文作者上岸!
本文链接https://www.cnblogs.com/Seversan-Sickle/p/17228243.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Seversan-Sickle  阅读(58)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示