加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

通过两个汇编实例对高级语言数组实现原理的发现

发布时间:2020-12-16 22:28:14 所属栏目:大数据 来源:网络整理
导读:先要介绍一下寻址,我们要运行一个程序,可执行文件先会被加载到内存里面,CPU通过寻址,去内存里面找到这段可执行文件的程序,然后把它的程序段通过总线运送会CPU进行计算。 既然是寻址,就要知道物理内存的地址。这个地址由两部分组成。段首地址和偏移地址

先要介绍一下寻址,我们要运行一个程序,可执行文件先会被加载到内存里面,CPU通过寻址,去内存里面找到这段可执行文件的程序,然后把它的程序段通过总线运送会CPU进行计算。

既然是寻址,就要知道物理内存的地址。这个地址由两部分组成。段首地址和偏移地址。比方说,我有4个盒子,可以表示的信息量是2的四次幂,16个。我要有20个数据呢?怎么用四个盒子表示?就可以先用一种排列表示,然后再用一种排列表示,两种排列的顺序通过一定的约定,便可以表示20或者更多的数据了。

在计算机里的这一个约定是段首地址*16+偏移地址。

下面进入主题。

我们要把BaSicMinIx两个单词全部转化成大写字母。

VB中,我们可以用Ucase函数,在C语言中常用的是每个字母的ASCII值减去32,在输出。

还有一种办法,通过把A,a,B,b等等的ascii二进制数写出来,找到一个规律。

大写字母和小写字母的二进制的区别是,大写字母第五位是0,小写是1

所以在汇编语言中,我们利用的是逻辑and(与运算)和or(或运算)运算来实现大小写转换。

编写汇编代码

assumeds:data,cs:code

datasegment

Db'BaSic'

Db'MinIx'

dataends

codesegment

start:movax,data

Movdx,ax

Movbx,0

Movcx,5

.注意下面的代码

s:Moval,[bx]

Andal,11022222

Mov[bx],al

Moval,[bx+5]

Oral,00100000

Mov[bx+5],al

Incbx

Loops

._________________

movax,4c00h

int21h

codeends

endstart

程序段完了,那里的Andal,11022222是为了把第五位的数组改成0,下面的同理。这里不是重点理解。

Moval,[bx+5]又可以写成moval,5[bx]Mov[bx+5],al也可以写成mov5[bx],al。是不是5[bx]这个和VB里面a()数组和C语言的a[]形式有点相似?如果还看不出来,我们用C语言写出中间那段程序。

Chara[5]="BaSic"

Charb[5]="MinIx"

main()

{

inti;

i=0;

Do

{

a[i]=a[i]&0xDF;

b[i]=b[i]|0x20;

i++;

}

While(i<5);

}

如果你熟悉C语言的话,可以比较这个C语言程序和上面汇编语言程序的相似之处。尤其注意它们定位字符串中字符的方式。

C语言:a[i],b[i]

汇编语言:0[bx],5[bx]

是不是可以看出什么。

当然,这还没有结束。

下面这个例子更为经典。

这是一个公司的数据:

公司名称:ABC

总裁名称:Abc Defgh

排名:100

收入:10亿

产品:LMN

这些都写在了内存里面。时隔几年后,数据有很多变了,我们要改变一些数据。比方说Abc Defgh的排名已经上升到38位,收入增加了70亿,产品变成了VAX系列计算机。

我们先用C语言写。

//下面先是定义,不做重点。

Structcompany

{

Charcn[3];

Charhn[9];

Intpm;

Intsr;

Charcp[3];

}

Structcompanydec{"ABC","Abc Defgh",100,10,"LMN"}

//下面是改数据的过程。

Main()

{

IntI;

Dec.pm=38;

Dec.sr=dec.sr+70

i=0;

Dec.cp='L';

i++;

Dec.cp='M';

i++;

Dec.cp='N';

Return0;

}

用汇编语言写出改数据的部分就可以了。

Movax,seg

Movds,60

.这里是重点

Movwordptr[bx].0ch,38

Addwordptr[bx].0eh,70

Movsi,0

Movbyteptr[bx].10[si],'L'

Incsi

Movbyteptr[bx].10[si],'M'

Incsi

Movbyteptr[bx].10[si],'N'

我们开始比较,C语言中的语句是Dec.cp='V',汇编语言中是.....[bx].10[si],'V'

C语言中,我们看到,如:dec.cp[i]dec是一个变量名,指明了结构体变量的地址,cp是一个名称,指明了数据项cp的地址,而用i来定位cp中的每一个字符。汇编语言的做法是,bx.10[si]是不是很相似?

在熟悉的VB环境中,定义一个数组dima(9),我们就可以理解了,a是一个物理地址的首地址,a里面的数据代表的是一个个偏移地址。

汇编语言的这种寻址方式([bx+idata][bx+si+idata]),为高级语言实现数组实现了便利机制。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读