【汇编语言】第七章 更灵活的定位内存地址的方法
目录
前言
最近学了王爽教授写的《汇编语言》,整理一下学习笔记。
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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix