汇编语言学习第七章-更灵活的定位内存地址的方法

2024-08-25 05:18

本文主要是介绍汇编语言学习第七章-更灵活的定位内存地址的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

            本博文系列参考自<<汇编语言>>第三版,作者:王爽


前面已经通过类似[0]和[bx]的方法进行了内存定位了。本章将涉及更多内存地址定位和编程的方法。


7.1 and 和 or 指令

(1) and指令,逻辑按位与指令

例如:

mov al,01100011B

and al,00111011B

执行后 al=00100011B 

and指令可以用来将某个数的位置为零。

比如我们要将al的第二位置为零,则: and al,11111101B

依次类推。


(2) or指令,逻辑按位或指令

例如:

mov al,01100011B

or   al,00111011B

执行后 al=01111011B

or指令可以用来将某个数的位置为1

比如我们要将al的第高位置为一,则: or al,10000000B


7.2 关于ASCII码

在计算机中所有的信息都是以二进制方式进行存储的,那么计算机是如何存储我们输入的文本,字符这些信息,然后再讲这些信息输出给用户呈现呢?

那么我们可以这样想,当我们输入到计算机的信息和输出展示给用户的信息都是通过某种规则进行转换的。输入的时候通过这样的规则将用户的信息转换为二进制存储,输出的时候将计算机中存储的二进制信息进行翻译出来给用户。那么不言而喻,要想输入的信息和输出信息表达的意思是一致的,我们必须采用某种同样的规则来对这些信息进行解释。这就称为编码。

计算机中最常用的编码方式为ASCII编码。该编码用7位二进制表示128个基本的字符,字母和数字。后来ASCII扩展到8位增加了128个编码。当然根据每个国家文字的不同,又有很多不同编码比如中国的GB2312,不过为了进一步统一编码规则,现在也逐步推广unicode编码的使用。这种编码能够涵盖世界上所有的文字,字母,字符信息。


7.3 以字符形式给出的数据

如果学过C语言,那么很好理解当我们在C语言定义字符串的时候,字符串的每个字符都是以ASCII编码的方式在计算机中进行存储的。

汇编语言与一样我们可以把字符直接存储在'.....'中,这样程序会将'....'定义的字符以ASCII码存储在计算机中。看下面的程序:


这段程序定义了一个数据段ds和代码段cs,其中数据段存储了 'unIX' 和 'foRK'。

db 'unIX' 相当于db 75H,6EH,49H,58H 这四个数字分别代表了unIX四个字母的ASCII码

db 'foRK' 相当于db 66H,6FH,52H,4BH 这四个数字分别代表了foRK四个字母的ASCII码


mov al, 'a'相当于mov al,61H 61为字符a的ASCII码

mov al, 'b'相当于mov al,62H 62为字符b的ASCII码


接下来我们进行编译链接成vpoet并通过debug工具查看其寄存器和指令:


看到MOV AL,61和MOV BL,62可以证明实际上计算机内部的确是用ASCII来表示字符。

记下来我们在使用d命令查看数据段在内存中存储的内容:

果然数据段中定义的字符串在内存中也是按照字符的ASCII码依次存储的。


7.4 大小写转换问题

有如下代码段:


将第一个字符串'BaSiC'全部转换为大写,第二个字符串'iNforMaTiOn'全部转换为小写。


我们要考虑如下几个问题:

根据大写与小写字符的ASCII码值相差20H

小写转换为大写可以使用 小写字符ASCII码值-20H=大写字符ASCII码值

大写转换为小写可以使用 大写字符ASCII码值+20H=小写字符ASCII码值

但是问题来了我们当前还没学过汇编的加法和减法运算符。肿么办呢?

通过分析我们可以发现,当我们用二进制表示字符的ASCII码值的时候。大写与小写的诧异主要在第5位上。

比如a的ASCII值为97 二进制1100001

      A的ASCII值为65 二进制1000001

它们主要的区别在第五位,当大写的字符的时候第五位为1,当小写字符的时候第五位为0.所以这里我们可以用按位与和按位或

操作进行大小写转换。

实现代码如下:

<pre name="code" class="plain">assume cs:codesg,ds:datasgdatasg segmentdb 'BaSiC'db 'iNfOrMaTiOn'
datasg endscodesg segment
start: mov ax,datasgmov ds,axmov bx,0mov cx,5s:mov al,[bx]and al,11011111Bmov [bx],alinc bxloop smov bx,5mov cx,11s0:mov al,[bx]or al,00100000Bmov [bx],alinc bxloop s0mov ax 4c00hint 21h
codesg ends
end start


 

7.5 [bx+idata]

[bx]代表一个内存地址的偏移量。假设其段地址在ds中。那么[bx]可以表示值为((ds)*16+(bx))

[bx+idata]其中idata代表常量,同样表示一个地址:((ds)*16+(bx)+200)

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

我们接近着7.4的问题有如下的问题,同样是将第一个字符串转换为大写,第二个字符串转换为小写。

这次第一个字符串为'BaSiC'  第二个字符串为'MinIX' 两个字符串均为5个字符的字符串

在7.4中我们处理两个字符串的时候需要两次分别复制给bx字符串的起始偏移地址,第一个字符串偏移地址为mov bx,0

第二个字符串的偏移地址为mov bx,5

现在我们可以[bx+idata]方式进行改写

assume cs:codesg,ds:datasgdatasg segmentdb 'BaSiC'db 'MinIX'
datasg endscodesg segment
start: mov ax,datasgmov ds,axmov bx,0mov cx,5s:mov al,[bx]and al,11011111Bmov [bx],almov al,[bx+5]or al,00100000Bmov [bx+5],alinc bxloop smov ax 4c00hint 21h
codesg ends
end start

这里我们通过[bx]和[bx+5]分别索引两个字符串进行大小写转换,因为两个字符串的长度都是5,所以只需要一个循环即可将两个字符串一次性进行大小写转换的改写。


7.7 SI和DI

SI和DI与普通寄存器一样,但是SI和DI不能像AX一样分成AL和AH两个寄存器。

有如下问题,需要将'welcome to masm!'这个字符串复制到其之后的数据区。


代码如下:


这里我们还可以使用前面介绍的[bx+idata]方式:



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

假设段地址为ds,[bx+si]解释为((ds)*16+(bx)+(si))

假设段地址为ds,[bx+si]解释为((ds)*16+(bx)+(di))


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

假设段地址为ds,[bx+si+idata]解释为((ds)*16+(bx)+(si)+idata)

假设段地址为ds,[bx+di+idata]解释为((ds)*16+(bx)+(di)+idata)


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

我们现在总结下所学的内存寻址方式:

[idata]用一个常量表示地址,可用于直接定位一个内存单元

[bx]用一个变量来保存内存地址,可用于间接定位一个内存单元

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

[bx+si]用两个变量表示地址

[bx+si+idata]用两个变量和一个常量表示地址


请顶我一下~~~


这篇关于汇编语言学习第七章-更灵活的定位内存地址的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104649

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操