页面加载中,请稍候
来源:一口Linux发布时间:2021-12-26354浏览
询问 AI
注意这里的限定,再读一遍,没有高级语言,没有操作系统,在这样的限制之下,你必须直面内存读写的本质。这个本质是什么呢?本质是你需要意识到内存就是一个一个装有字节的小盒子,这些小盒子从0到N编好了序号。这时如果你想计算1+2,那么你必须先把1和2分别放到两个小盒子中,假设我们使用Store指令,把数字1放到第6号小盒子,那么用指令表示就是这样:store16注意看这条指令,这里出现了两个数字:1和6,虽然都是数字,但这两个数字的含义是不同的,一个代表数值,一个代表内存地址。与写对应的是读,假设我们使用load指令,就像这样:loadr1 6现在依然有一个问题,这条指令到底是数字6写入r1寄存器还是把第6号小盒子中装的数字写入r1寄存器?可以看到,数字在这里是有歧义的,它既可以表示数值也可以表示地址,为加以区分我们需要给数字添加一个标识,比如对于前面加上$符号的就表示数值,否则就是地址:store$16load r1 6这样就不会有歧义了。现在第6号内存中装入了数值1:

地址6 -> 数字1但“地址6”对人类来说太不友好了,人类更喜欢代号,也就是起名字,假设我们给“地址6”换一个名字,叫做a,a代表的就是地址6,a中存储的值就是1,用人类在代数中直观的表示就是:a1就这样所谓的变量一词诞生了。
表示数值1
该数值存储在第6号内存地址
ba把a的值给到b,这个赋值在内存中该怎么表示呢?很简单,我们为变量b也找一个小盒子,假设变量b放在第2号小盒子上:
现在变量a占据5个字节,足足占用了整个内存的一大半空间,此时如果我们依然想要表示b = a会怎样呢?如果你依然采用copy 的方法会发现我们的内存空间已经不够用了,因为整个内存大小就8字节,采用copy的方法仅这两个变量代表的数据就将占据10字节。怎么办呢?不要忘了变量a背后可是有两个含义的,再让我们看一下:表示数值1
该数值存储在第6号内存地址

loadr1 1想一想,这是不是会有问题,因此这样的话该指令会把数值3加载到r1寄存器中,然而我们想要把内存地址1中保存的数值也解释为内存地址,这时必须为1再次添加一个标识,比如@:loadr1@1这时该指令会首先把内存地址1中保存的值读取出来发现是3,然后再次把3按照内存地址进行解释,3指向的数据就是变了a:地址1 -> 地址3 -> 数据a这就是所谓的间接寻址,Indirect addressing,在汇编语言下你必须能意识到这一层间接寻址,因为在汇编语言中是没有变量这个概念的。然而高级语言则不同,这里有变量的概念,此时地址1代表变量b,但使用变量的一个好处就在于很多情况下我们只需要关心其第一个含义,也就是说我们只需要关心变量b中保存了地址3,而不需要关心变量b到底存储在哪里,这样使用变量b时我们就不需在大脑里想一圈间接寻址这一问题了,在程序员的大脑里变量b直接指向数据a:b-> 数据a再来对比一下:地址1 -> 地址3 -> 数据a # 汇编语言层面变量b -> 数据a # 高级语言层面这就是为什么我说指针其实是内存地址的更高级抽象,这个抽象的目的就在于屏蔽间接寻址。当变量不仅仅可以存值也可以存放地址时,一个全新的时代到来了:看似松散的内存在内部竟然可以通过指针组织起来,同时这也让程序直接处理复杂的数据结构成为可能,比如就像下图这样:

这就是所谓的链表了。

end
一口Linux
关注,回复【1024】海量Linux资料赠送
精彩文章合集
文章推荐
☞【专辑】ARM☞【专辑】粉丝问答☞【专辑】所有原创☞【专辑】linux入门☞【专辑】计算机网络☞【专辑】Linux驱动☞【干货】嵌入式驱动工程师学习路线☞【干货】Linux嵌入式所有知识点-思维导图点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看
新闻来源:一口Linux,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!

2026-07-10
2026-06-04