逆向基础--汇编基础(字与物料地址) (004)
一.字的存储
我们听过字节的概念,1个字节等于8比特位,那么字和字节的关联是1个字等于2个字节。比特记为bit,字节记为Byte,字记为word,所以有如下关系:
1Byte=8bits, 1word=2Bytes=16bits
而8060CPU出于兼容性的考虑,一次性可以处理两种尺寸的数据:字节以及数据
一个寄存器可以存储一个字数据,例如数据2000 D,其二进制数值为:0000 0111 1101 0000,存储格式如下:

上述是从寄存器出发,描述了一个16位数据在寄存器中的存储格式,而我们在使用汇编的过程中还会操作内存,那么在内存中一个字又可以用怎么样的格式体现?
内存单元是字节单元,也就是说一个字节单元对应一个内存单元,当我们要保存一个字数据时,应该用两个地址连续的内存单元来保存。数据的低字节存放在低地址单元中,高字节存放在高地址单元中,假设我们从0地址开始存放2000 D(对应16进制 07D0 H),其中07是高字节,D0是低字节,内存单元是以16进制来体现的。如下所示:

上图中用0、1两个单元用来存储一个字,同理也可以把2、3看成一个字单元 。
字单元(wrod)是指:一种用来存储字型数据的内存单元。
字 (Word):一个硬件和性能概念,是CPU的“标准数据集装箱”,大小固定,追求处理效率。
一个16位的cpu,1字有2个字节的存储大小。
一个32位的cpu ,1字有4个字节的存储大小。
一个64位的cpu,1字有8个字节的存储大小。
总结:内存单元属于内存,内存的最小单位是内存单元,每个单元用于存储一个字节 。 假设一台电脑有 8G内存 = 约85亿个内存单元(8 × 1024³ × 1024 × 1024个字节),每个内存单元都有唯一的地址,1个内存单元 = 1个字节 = 8个二进制位, 内存中实际存储的是二进制,但是以16进制体现(这是因为二进制表示太长,不便于人类阅读和书写。16进制是二进制的紧凑表示)。
字长(Word Size)直接决定了CPU一次能处理的数据块有多大,以及能直接寻址的内存空间有多大。对于64位的cpu,一次能处理8个字节的数据,吞吐量提高了。
通俗讲:字长好比高速公路,16位是2车道,32位是 4车道,64位是 8车道。车道越多,一次性能并行通过的车辆(数据)就越多,交通效率(计算速度)自然越高。
二.物理地址与段地址
CPU在访问内存单元之前,应该要给出内存单元的地址。所有的内存单元构成的存储空间是一个线性空间。每一个内存单元在这个空间中都有一个唯一的地址,称为物料地址。
线性空间:内存单元按顺序排列是一维的空间,每个内存单元都有一个连续的地址编号,从0开始一直到内存的最大容量。这种线性结构使得CPU可以通过一个唯一的地址(物理地址)来访问每个内存单元。
那么8086CPU具备如下特性:
1) 一次最多可以处理16位的数据
2)寄存器的最大宽度是16位
3)寄存器和运算器之间的通路(传输的意思)为16位
也就是说,8086CPU内部一次性能处理的数据长度最大为16位。它的地址总线是20位,在内部有一个地址加法器可以将两个16位地址合成一个20位的物理地址,示意图如下:

当CPU要操作内存时,内部有如下事件发生:
1) CPU中相关部件提供了两个16位地址,一个称为段地址,一个称为偏移地址
2)段地址和偏移地址经过内部总线送入地址加法器
3)地址加法器将两个16位地址合成一个20位的物料地址(用于找16位的内存单元,在8086CPU中字长为2字节,占用两个内存单元共16位)
4)地址加法器将20位的物料地址通过内部总线送入输入输出控制电路
5)输入输出控制电路将20位地址送入地址总线
6)20位物理地址被地址总线送到存储器
地址加法器采用:物料地址=段地址*16+偏移地址的方法来合成物料地址,这样一个16位机就可以访问20位地址,寻址能力(CPU能管理和访问多大的内存空间)也从64kb扩大成1MB。
其中64kb是指H:0 -- 65535的地址编号, 而20位是指0 --(2的20次方)
如果是10进制那么1 *10=10,如是是16进制那么12H*16=120H。
例如:CPU要访问地址为123C8H的内存单元,地址加法器的工作过程为:

20位的物料地址是指:段地址 × 16 + 偏移地址,下面用一个更生动的比喻来理解:
原来的16位寻址(64KB):就像你只有一个16位的编号,只能管理一个很小的阅览室(64KB)里的书。8086的分段寻址(1MB):段地址(Segment):就像图书馆的楼层号或区域号(比如“2楼”或“A区”)。这个区域很大,而且起始位置是固定的。× 16 :这个操作相当于说,每个“区域”的起点都在一个很大的、对齐的位置上(比如,1区从0号书架开始,2区从10000号书架开始,3区从20000号书架开始...)。偏移地址(Offset):这是在你指定的区域内部的具体书架号。合成物理地址:你想找一本书,管理员需要先知道你它在哪个区域(段地址),然后在这个区域内找到具体的书架(偏移地址)。最终位置 = 区域的起始位置 + 区域内的书架号通过这种方式,使用两个16位的数字(区域号、书架号),组合起来就可以在远超64KB的整个1MB图书馆里定位任何一本书了。
总结:通俗来说,街道就是整个内存空间(如8G内存空间),如果你想访问街道某栋房子(每栋楼是内存单元,可以单独寻址的“房子”是1个字节,意味着有80亿套这样的房子),你只需要说出门牌号(物理地址就是房子的门牌号,从0开始一直到80亿左右的一个唯一数字)即可。
一个8G的内存,有80亿个内存单元编号,20位的寻址无法覆盖8GB的内存。
---32位寻址:2^32 = 4,294,967,296 字节 = 4GB。
---64位寻址:2^64 = 18,446,744,073,709,551,616 字节 = 16EB(1EB=1024TB)。所以8GB的内存需要64位寻址。
如果是16位寻址,最多生成65535的内存单元编号。只能覆盖64kb的内存空间。
如果是20位寻址,最多生成2^20的内存单元编号,覆盖1MB的内存空间。
如果是32位寻址,最多生成2^32 的内存单元编号,覆盖4GB的内存空间。
如果是64位寻址,最多生成2^64的内存单元编号, 覆盖16EB的内存空间(cpu架构:windows系统x86-64,移动或mac的ARM64,目前市场64位是最见的)。
作者:花阴偷移
出处:https://www.cnblogs.com/MrHSR/
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953473.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!