对底层寻址的理解

接触编程有很久的时间了,从高中接触JAVA,到大学学习C语言,偶尔偷懒学习一下PYTHON。这几门语言包括了几个类别,面向过程,面相对象,包括诸如PYTHON这样的动态脚本。他们从表面来看语法都不相同,编程的思想也不同,抛开这些表面的东西,我们来谈一谈它们的本质,它们的本质都是相同的,那么现在问题是,它们的本质是什么,我的总结是不光是这三门编程语言,所有的编程语言的本质都是一样的,那就是赋值语句。一个简单的赋值语句可以包括给用常量给变量赋值,也涵盖了变量对变量的赋值。既然我们都说到了编程的本质是赋值,那我们在思考一下程序的本质是什么?书上的答案是说通过算法和数据结构完成一定的事情。只能说课本说的太笼统,你那么说谁都知道是那么回事,还是没有讲到本质,当然这个本质也不是我得到了,是我看了很多外籍的编程书籍和一些工程师的博客了解到的。他们说程序的本质是数据的搬运,就是说数据在内存中的来回移动,这里的内存泛指可以存储数据的单元,包括寄存器。我也在很久的编写代码的日子里体会了这句话,确实是对的。无疑就是数据的搬运,就是把一个数据写到一块内存。

现在一个个问题又来了,为了完成上面的操作,CPU需要知道哪些信息?为了解决这个问题,我们还需要知道CPU能识别的信息是哪些,这个问题是必要的,总不能说我把需要的信息给到CPU,CPU应为无法识别而导致程序跑飞或者崩溃,那不是白忙活了嘛。

现在我们一个个问题往回推。我们知道CPU只有三种总线,地址总线,数据总线,控制总线,那么他能识别的信息只有数据,地址,控制信号。这就解决了一个问题,再往回回答,就是说CPU需要知道哪些信息,那为了忘内存中写一个数据,CPU需要知道哪块内存也就是地址,再者就是说你要写的数据了,那到这里还需要知道数据长度,对应到CPU就是说我需要操作多大的内存。好这个问题也解决了,我们对比一下这个答案和上面刚回答的问题的答案,发现CPU需要知道的信息恰好满足CPU可以识别的信息,这刚刚好。

这时我们再回到最初的本质,完成一个写数据到内存的操作,此时此刻,我试图把它说的详细一些,他可以拆分成两句话。

1,CPU已经再指令缓冲区得到这个数据,直接把它写入到一块内存

2,CPU再指令缓冲区得到了将被写入内存的数据的地址,根据这个地址找到数据,然后再把数据写入一块内存。

再总结一下上述两句话,对于源操作数来说,你要么直接告诉CPU数据,要么告诉CPU你要写的数据要从哪里获得。对于目的操作数来说,你必须告诉CPU地址,否则CPU不知道把数据写到什么地方。

这时我们已经知道了程序的本质和CPU如何完成这个操作,现在让我们对应到8086的指令来说寻址。

首先你需要理解MOV DST,SRC这个指令,它就是把源操作数复制到目的操作数当中,至于它不能完成的操作在这里不说了,不懂得可以去查8086。我用自己的语言来具体描述一下这个指令。

1,如果SRC是数据,此时数据总线就是SRC,地址总线是DST,控制信号是写有效信号。

2,如果SRC是数据的地址,这个过程需要两个CPU总线周期去完成,分布列出来,如下。

2.1地址总线是SRC,数据总线是带读取的数据,控制总线是读有效信号,

2.2地址总线是DST,数据总线是刚才读取的数据,控制总线是写有效信号。

其实我刚才在用自己的语言解释MOV指令时,里面蕴含了对内存操作,现在明确的说出来,CPU对内存操作,首先必须给出想要操作的内存的起始地址(有可能你操作的内存是字或者是双字),其次CPU知道需要操作多大的内存(内存是足够大的,CPU自己不知道需要操作多大的内存)。给出了这两个信息加上控制信号你就可以准确的控制内存了。

为什么我们的MOV通常不需要写长度和控制信号呢?这里慢慢解答,首先你的每个指令在翻译成机器语言后都对应这一种或多种控制信号,如同上面说的,MOV可以是写信号,也可以是先读后写的信号,所以说我们不需要在操作数中指明控制信号,因为指令帮我们做了,那为什么我们也没有指明长度呢,首先这肯定是误解,我不能把我自己的理解写出来,不是不想分享给大家,是因为我能理解但是说不出来,语言表达太差,这里我举几个例子,大家体会一下,MOV AX,[SI],这里的源操作数就是内存操作数,只给出了地址,没有指明长度,完整的写法应该是 MOV AX,WORD PTR [SI],这里我不确定自己写的对不对,因为我是看视频学习的32位操作系统的汇编,而8086是16位的,它的字是16位,所以我猜测是WORD PTR,如果错了也没关系,不用纠结只是想告诉大家完成的写法不仅仅包括地址,还应该指明长度,为什么我们这里不用指明长度内,那是应为编译器默认帮你做了,应为你的AX的长度是确定的,只要两个操作数中一个长度是确定的,另一个可以省略长度,所以这里我们可以不添加长度。再举一个相反的例子。MOV BYTE PTR [SI],23h,这里的目的操作数就指明了长度,而且这里的长度省略的话就是错的,为什么呢,应为立即数的长度是任意的,它是可变长的了类型,目的操作数长度是多少它的长度就是多少,所以这里目的操作数的长度不能省略了。希望大家体会到了,我的表达确实不太好。

上面说了那么多,我们知道对内存完成精确的操作,控制信号包含在指令当中了,长度有时候编译器帮你做了,有时候你需要自己明确写出,而只有寻址是需要我们自己指定的。所以可以看的出来为什么要寻址。不寻址我们就没法对内存操作,不对内存操作就没法完成数据的搬运,那一个程序就没法完成,所以可见寻址的重要性。

我们已经了解了寻址,8086除了IO的寻址只有7种,都很简单,就是给出地址,还不懂的话可以私聊。

QQ  68114806

QQ答案 python

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值