寄存器与内存通信
cpu通过地址总线、数据总线、控制总线与内存进行通信。地址总线负责特定内存单元的寻址;数据总线对当前选择的内存单元进行读写操作;控制总线确定数据的读写操作。存储器芯片包括:RAM主存、BIOS基本输出输入软件系统ROM,此ROM控制接口设备的数据输出操作;根据以上可知,cpu不仅要跟ram进行通信,还要跟rom等接口设备通信,为了实现这一多接口设备的通信功能,计算机引入虚拟地址空间。虚拟地址空间经过一定的映射关系,与实际的内存单元或者特定的接口设备进行通信。
cpu在进行通信的过程中,每次能够传输的位数或者字节数,叫字长。1个存储单元为1个字节,地址总线大小为16位2个字节,那么一个字长就是两个字节。因为地址总线大小为16位,所以可寻址空间大小为2的16次方。为了扩充可寻址空间的大小,计算机中引入偏移地址。cpu一次传送两个地址,一个地址叫段地址,一个地址叫偏移地址,将16位的段地址乘以16,即进一个位等到10位的段地址;再将编译地址加上端地址,就得到最终的实际内存单元,扩充cpu的寻址空间。比方说段地址为2000H,偏移地址为1000H,那么最终内存单元为2000*16+1000=21000H
根据上述cpu的寻址方式,引出新的名字:段地址,端地址是内存中连续的一段存储单元。段地址是这一段地址的起始存储单元,编译地址是根据端地址加上编译地址得出的此端地址的特定地址单元。因为数据总线的大小为16位,所以编译地址的变化范围为:2的16次方,即一个段地址大小可达64KB.
一个寄存器的大小为一个字即两个字节。cpu中存在存放段地址的寄存器,cs寄存器,cpu根据cs寄存器中的地址找到内存单元的起始地址,在根据存放偏移地址的Ip寄存器,找到这一段地址中的内存单元。cpu从此处执行内存单元存放的指令。
与cpu执行内存单元指令的相似。cpu存在ss和sp两个寄存器,这两个寄存器存放的数据指向,内存的栈端。其中ss指向栈的起始地址,sp指向特定的栈单元即栈顶元素。栈是LIFO结构,入栈操作指令是push,比如push ax,执行的顺序为:sp指针减二,然后将ax中的元素放入栈中,由此得知入栈操作,栈地址减小;出栈操作:pop ax;首先sp指针加2,然后将此数据拿出来,存入ax中。因为sp总是指向栈顶元素,所以空栈的话,sp指向栈最大地址的下一个地址。
cpu中还存在一个ds寄存器,在各寄存器或者寄存器与内存单元数据的转移过程中,此寄存器存放内存单元的段地址。只要在指令中给出编译地址,就可以根据ds的段地址,得到确切的内存单元,比如mov ax [0],ds=2000H.就是将内存单元2000*16+0=20000H的内存单元和此内存的单元的下一个内存单元的值一起赋值给ax寄存器,这种内存的寻址方式叫间接寻址。寻址方式还有直接寻址:mov ax 2000H,将16进制的常数2000赋值给寄存器。还有相对寻址,基址变址寻址,相对基址变址寻址,
cpu中不同的寻址方式可以用来定义多样的数据结构。在编程的过程中,我通常定义单独的数据段,单独的栈段,和单独的代码端,使得的结构清晰。
参考:《汇编语言》《深入理解计算机系统》
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 《HelloGitHub》第 108 期