ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

内存中数据的存储与获取

2022-04-05 18:31:56  阅读:208  来源: 互联网

标签:存储 字节 地址 获取 2000 内存 寄存器 AX


数据的获取

CPU 通过段地址和偏移地址获取内存中的数据, 根据寄存器的大小获取相应的字节数目: mov al,ds:[0]

ds 为段地址寄存器, [0] 表示偏移地址为 0
物理地址 = 段地址 * 0x10 + 偏移地址

从物理地址获取数据需要注意存储该数据寄存器的长度,下面将通过实例进行展示

  1. 先对目标地址 2000:0 中的数据初始化,赋值为 "123456789A`

  1. 写入指令将 ds 段地址寄存器赋值为 2000: 用于寻找物理地址 2000:0 (0x20_000H)

注意 ds 寄存器不能直接修改,需要通过数据寄存器间接修改

  1. 将内存单元中的 2000:[1], 2000:[3], 2000:[4] 分别送入 AX, BH, CL 中查看效果

可以看到根据物理地址我们其实只能定位到两位 16 进制数,也就是 8 bit,也就是 1 字节数据,这个和 BH 或 CL 寄存器的长度是一致的,所以直接对应存储;但是 AX 是 16 位寄存器,也就是 2 字节的长度,这时就需要向高位寻找,用于填充 AX 的高位字节,所以 AX 的值是 {2000:[2]} {2000:[1]}

数据的存储

一个内存单元只能存储一字节的数据, 对于 Byte 来说只需要一个内存单元即可存放;

但对于 Word(=2Byte) 则需要两个连续的内存单元存放, 将高位字节存放到内存的高位地址, 低位字节存放到内存的低位地址中。用下面一个例子来实践一下

  1. 使用 e 2000:0 修改目标内存单元的数据, 只能写入两位十六进制数, 也就是 8 位二进制数

  1. AX, BX, CX, DX 这些寄存器的大小都是一个字 (word=2Byte=16bit) 在这我们利用 AX 将两个字节的数据存储到内存单元中; 首先将 AX 寄存器赋值 1122

  2. 然后将 DS 寄存器(CPU默认用 DS 在内存寻址) 定位到 2000:0, 现在的状态就是赋值前的初始状态:

不能直接修改 DS 寄存器, 需要借助 A-DX 寄存器间接修改

2000:0 处的内存状态:

  1. 利用 DS 寄存器将 AX 寄存器中的内容放到内存单元 2000:0 中, 他会按照寄存器的大小, 自动分配相邻的两个内存单元, 如图所示, 11 是高位字节因此放到了内存的高位地址处;
mov [0], ax

在这里 [0] 也就是 [0000] 用于定义 DS 的偏移地址, 合起来也就是 2000:0000 的内存地址

标签:存储,字节,地址,获取,2000,内存,寄存器,AX
来源: https://www.cnblogs.com/DF-yimeng/p/16006236.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有