第七章 更灵活的定位内存地址的方法 其一

摘要:
引言前面,我们用[0]、[bx]的方法,在访问内存的指令中,定位内存单元的地址。在这一章中,我们主要讲解一些更灵活的定位内存地址的方法和相关的编程方法首先我们介绍两条指令and和or,因为我们下面的例子中要用到他们。代码如下:更简洁的代码:7.8[bx+si]和[bx+di]在前面,我们用[bx]和[bx+idata]的方式来指明一个内存单元,我们还可以用更灵活的方式:{bx+si][bx+di][bx+si]表示一个内存单元,它的偏移地址bx中的数值加上si中的数值。

引言

前面,我们用[0]、[bx]的方法,在访问内存的指令中,定位内存单元的地址。

在这一章中,我们主要讲解一些更灵活的定位内存地址的方法和相关的编程方法

首先我们介绍两条指令and和or,因为我们下面的例子中要用到他们。

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

如mov al, 01100011B

and al, 00111011B

执行后:al=00100011B

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

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

如 mov al,01100011B

or al,00111011B

执行后:al=01111011B

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

7.2关于ASCII码

世界上有很多编码方案,有种方案叫做ASXII编码,是在计算机系统中通常被采用的。

简单的说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示显示对象。

比如说,在ASCII编码方案中,用61H表示‘a',62H表示’b'。

7.3以字符形式给出的数据

我们可以在汇编程序中,用‘,,,’的方式指明数据是以字符的形式给处的,编译器将把他们转化为相对应的ASCII码。

例如以下程序:

第七章 更灵活的定位内存地址的方法 其一第1张

第七章 更灵活的定位内存地址的方法 其一第2张

7.4 大小写转换的问题

首先分析一下,我们知道同一个字母的大写字符和小写字符对应的ASCII码是不同的,比如‘A’的ASCII码是41H,a的ASCII码是61H。

要改变一个字母的大小写,实际上就是要改变它所对应的ASCII码

第七章 更灵活的定位内存地址的方法 其一第3张

通过对比,我们可以看出来,小写字母的ASCII码值比大写字母的ASCII码值大20H。

这样我们可以想到,如果将a的ASCII码值减去20H,就可以得到A,如果将A的ASCII码值加上20H就可以得到a。

第七章 更灵活的定位内存地址的方法 其一第4张

要注意的是:

对于字符串BaSic,我们应只对其中的小写字母所对应的ASCII码进行减20H的处理,将其转为大写,而对其中的大写字母不进行改变。

对于字符串iNforMaTIOn,我们应支队其中的大写字母所对应的ASCII码进行加20H的处理,将其转为小写;而对于其中的小写字母不进行改变,

另一种方法:

可以看出,就ASCII码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。

大写字母ASCII码的第5位(位数从0开始)为0,小写字母的第5位为1.

这样,我们有了新方法

一个字母,我们不管它原来是大写还是小写:

我们将它的第五位置0,他就必变为大写字母

将它的第五位置1,它就必将变为小写字母。

代码如下:

1 assume cs:codesg,ds:datasg
2 datasg segment
3 db 'BaSiC'
4 db 'iNfOrMaTiOn'
5 datasg ends
6 
7 codesg segment
8 start: mov ax,datasg
9 mov ds,ax        ;设置ds指向datasg段
10 
11        mov bx,0            ;设置(bx)=0,ds:bx指向“BaSiC”的第一个字母
12 
13        mov cx,5;设置循环次数5,因为“BaSiC”的有5个字母
14 s: mov al,[bx]        ;将ASCII码从ds:bx所指向的单元中取出
15 and al,11011111b        ;将al中的ASCII码的第5位置为0,变为大写字母
16 mov [bx],al        ;将转变后的ASCII码写回原单元
17 
18 inc bx            ;(bx)加1,ds:bx指向下一个字母
19 loop s
20 
21 
22        mov bx,5            ;设置(bx)=5,ds:bx指向“iNfOrMaTiOn”的第一个字母
23 
24        mov cx,11;设置循环次数11,因为“iNfOrMaTiOn”的有11个字母
25 s0: mov al,[bx]
26 or al,00100000b        ;将al中的ASCII码的第5位置为0,变为小写字母
27 mov [bx],al
28 inc bx
29 loop s0
30 
31 mov ax,4c00h
32        int21h
33 codesg ends
34 end start

7.5 [bx+idata]

在前面,我们可以用[bx]的方式来指明一个内存单元,我们还可以用一种更为灵活的方式来指明内存单元:

[bx+idata]表示一个内存单元,他的偏移地址为bx中的数值加上idata。

指令mov ax,[bx+200]也可以写成如下格式(常用):

mov ax,[200+bx]

mov ax,200[bx]

mov ax,[bx].200

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

有了[bx+idata]这种表示内存单元的方式,我们就可以用更高级的结构来看待所要处理的数据。

第七章 更灵活的定位内存地址的方法 其一第5张

我们可以把上节中关于字母大小写转换的代码改写成上面那样,就像是一个数组。

7.7 si和di

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

第七章 更灵活的定位内存地址的方法 其一第6张

第七章 更灵活的定位内存地址的方法 其一第7张

第七章 更灵活的定位内存地址的方法 其一第8张

代码如下:

第七章 更灵活的定位内存地址的方法 其一第9张

更简洁的代码:

第七章 更灵活的定位内存地址的方法 其一第10张

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

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

{bx+si]

[bx+di]

[bx+si]表示一个内存单元,它的偏移地址bx中的数值加上si中的数值。

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

[bx+si+idata]表示一个内存单元,他的偏移地址是bx中的数值加上si中的数值再加上idata。

第七章 更灵活的定位内存地址的方法 其一第11张

免责声明:文章转载自《第七章 更灵活的定位内存地址的方法 其一》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Stm32ADC-内部温度传感器的使用url scheme下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#数据类型转换

1. 装箱、拆箱还是别名   许多 C#.NET 的书上都有介绍 int -> Int32 是一个装箱的过程,反之则是拆箱的过程。许多其它变量类型也是如此,如:short <-> Int16,long <-> Int64 等。对于一般的程序员来说,大可不必去了解这一过程,因为这些装箱和拆箱的动作都是可以自动完成的,不需要写代...

16进制Unicode码和汉字互相转换

后台给我返回了一堆这样的东西,咱也不敢问,只能自己解决了! 上代码: function unicode16ToCn(unicode16data){     console.log(unicode16data);     var trans = unicode16data.match(/\u[0-9a-fA-F]{4}/g);     if(trans ...

【Python】使用socketserver建立一个异步TCP服务器

概述 这篇文章是讲解如何使用socketserver建立一个异步TCP服务器,其中Python版本为3.5.1。 socketserver主要的类 socketserver模块中的类主要有以下几个:1、BaseServer 包含服务器的核心功能与混合类(mix-in)的钩子功能。这个类主要用于派生,不要直接生成这个类的类对象,可以考虑使用TCPServer...

NodeJS笔记:处理非utf8编码

最近研究了下nodejs读写GBK文件的方法,nodejs原生的API接口如 fs.readFile(filename,[encoding],[callback]) 其encoding参数是不支持gbk的。实际上,如果不传encoding参数,返回的结果是一个Buffer类型的对象;如果传入参数,返回的是buffer.toString(encoding)的...

Windows下MySQL5.7版本中修改编码为utf-8

我们新安装的MySQL数据库默认的字符是 latin1 ,所以每次新建数据库都要修改字符,非常麻烦。所以我们必须将它改成UTF8字符的。 修改方法如下: 一、修改MySQL的my.ini 首先在 ProgramDataMySQLMySQL Server 5.7中找到my.ini文件,然后打开。 注意:①、如果没有ProgramData那就被隐藏了,自行去百...

Vim的字符编码设置

Vim编码方式的设置 和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,包括UCS-2、UTF-8 等流行的 Unicode 编码方式。但是,这需要用户自己动手设置。  Vim有四个跟字符编码方式有关的选项,分别是:encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请...