寻址方式总结

本文介绍了X86架构的发展历程,重点对比了8086与80386处理器的不同之处,详细解释了从实地址模式到保护模式的转变过程,并探讨了内存寻址方式及权限管理机制。

 

 

  1. 在X86系列中,8086是16位的处理器,从80386开始为32位的处理器,其中80286也是16位处理器,但是在寻址方式上开始了从实地址模式到保护模式的过渡。
  2. 当CPU是16位时,能决定的地址空间大小为1M字节,地址总线的宽度是20位。(CPU中ALU的宽度是16位,所以可直接加以运算的指针长度也是16位,所以产生了分段的方法,可以将16位的地址映射到24位的地址空间)
  3. 8086CPU中设置了四个段寄存器,CS(可执行代码),DS(数据),SS(堆栈),ES(其他),这些段寄存器都是16位,对应地址总线中的高16位,在相加的时候是用内部地址中的高12位和段寄存器中的16位相加,内部地址中的低四位保留不变。 

  1. 8086这种内存寻址方式缺乏对内存空间的保护,因为对于每一个从段寄存器的内容确定的基地址,一个进程能访问从它开始的64k字节的连续地址空间,没有限制,通过改变段寄存器的内容,一个进程可以随意访问内存中的任意一个单元,这就不能很好地保护进程和系统本身。这就是实地址模式。
  2. 80386是个32位的CPU,ALU数据总线是32位,所以他的寻址能力达到了4千兆(4G),80386是在8086的基础上,增添了两个段寄存器:全局性的段描述表寄存器GDTR和局部性的段描述表寄存器LDTR。通过改变段寄存器的功能,让它从基地址变为指向一些必要的数据结构的指针(指向段描述结构数组),由于从内部地址转换到物理地址的过程中必须要进行相关权限的确认。
  3. 在80386保护模式中是段式存储,但是更好地方法是页式存储管理,但是那些权限管理还有其他的数据结构离不开段式存管,所以相当于在有段式存管所映射而成的地址上再加一层地址映射。(8086中因为不用页式存管所以线性地址=物理地址,所以在保护模式下线性地址不再等同于物理地址,是先转换为线性地址,再转换为物理地址。)。把线性地址空间划分为4K字节的页面,每个页面被映射至物理存储空间任意一块大小为4K的区间,地址不一定连续。在页面目录中有1024项,每一项指向一个页面表,在每个页面表中有1024个页面描述项,所以可以一层一层的找上去,

                                                                                 页面目录-------》页面表-----》 页面偏移

 

<think> 嗯,用户想要获取ARM指令寻址方式的总结内容。从对话历史看,用户之前已经详细询问过ARM指令的寻址方式分类,我也给出了比较全面的回答。现在用户明确要求"总结",说明需要更精炼的概述。 用户可能是计算机体系结构或嵌入式系统的学习者,正在准备考试或整理笔记。ta特意强调"总结",暗示需要去掉细节保留主干。注意到用户三次引用站内资料,说明ta很重视权威定义,但又不希望直接复制引用内容。 我之前的回答已经将寻址方式分为数据处理和内存访问两大类,这个框架可以保留。用户特别关注的两个核心是: 1 寄存器移位寻址的零周期特性(桶形移位器实现) 2 内存访问中的变址模式差异(前/后变址) 需要强化对比表格的实用性,把"前变址"和"后变址"的典型应用场景补充进去。比如前变址适合数组定长访问,后变址适合指针遍历。用户引用的[2][3]都强调了这个特性。 另外用户没有问但可能需要的:寻址方式对指令长度的影响。立即数寻址受12bit限制,寄存器寻址更紧凑等。这个可以放在总结表格里作为补充。 最后生成的三个问题要体现递进性:从硬件实现(桶形移位器)到软件应用(函数调用),再到扩展场景(SIMD)。这样覆盖了用户可能深入研究的路径。 </think> 以下是ARM指令寻址方式的系统总结(基于ARMv7架构): ### 一、数据处理指令寻址 格式:$\text{<opcode>\{<cond>\}\{S\} <Rd>,<Rn>,<shifter\_operand>}$ | 寻址方式 | 格式示例 | 数学表达式 | 特点说明 | |----------------|-------------------------|--------------------------|---------------------------| | **立即数寻址** | `MOV R0, #0xFF` | $操作数 = \text{imm}$ | 12位立即数(含移位编码)[^1] | | **寄存器寻址** | `ADD R1, R2, R3` | $操作数 = R_n$ | 直接使用寄存器值 | | **寄存器移位** | `MOV R0, R2, LSL #3` | $操作数 = R_m \times 2^k$ | 桶形移位器实现零周期移位[^2] | **移位操作类型**: ```assembly LSL #n ; 逻辑左移 $R_m \times 2^n$ LSR #n ; 逻辑右移 $\lfloor R_m / 2^n \rfloor$ ASR #n ; 算术右移 $\lfloor R_m / 2^n \rfloor$(符号扩展) ROR #n ; 循环右移 $(R_m \gg n) \mid (R_m \ll (32-n))$ RRX ; 带进位右移 $[C \ll 31] \mid (R_m \gg 1)$ ``` ### 二、内存访问指令寻址 #### 1. 单数据访问(LDR/STR) | 模式 | 格式示例 | 地址计算 | 寄存器变化 | |---------------|------------------------|---------------------------|------------------| | **偏移寻址** | `LDR R0, [R1, #4]` | $地址 = R_b + \text{offset}$ | $R_b$不变 | | **前变址** | `LDR R0, [R1, #4]!` | $地址 = R_b + \text{offset}$ | $R_b \leftarrow R_b + \text{offset}$ | | **后变址** | `LDR R0, [R1], #4` | $地址 = R_b$ | $R_b \leftarrow R_b + \text{offset}$ | | **寄存器变址**| `LDR R0, [R1, R2]` | $地址 = R_b + R_x$ | - | #### 2. 批量存取(LDM/STM) ```assembly LDMIA R10!, {R0-R3} ; 加载: $地址 \leftarrow R_{10}, R_{10} \leftarrow R_{10} + 4\times n$ STMDB SP!, {R4-R6} ; 存储: $R_{SP} \leftarrow R_{SP} - 4\times n, 地址 \leftarrow R_{SP}$ ``` **寻址模式**: | 后缀 | 含义 | 栈类型 | |------|-----------------------|-------------| | IA | Increment After | 空递增栈 | | IB | Increment Before | 满递增栈 | | DA | Decrement After | 空递减栈 | | DB | Decrement Before | 满递减栈 | ### 三、寻址方式对比 | 特性 | 寄存器移位 | 前变址寻址 | 批量存取 | |---------------------|------------|------------|----------| | **时钟周期** | 1周期 | 2~3周期 | $n+1$周期| | **典型应用** | 快速乘法 | 数组访问 | 上下文切换 | | **硬件支持** | 桶形移位器 | 地址ALU | 突发传输 | > 💡 **关键设计**:桶形移位器与ALU并行工作,使移位操作实现**零额外时钟开销**[^1][^2],这是ARM高效性的核心设计之一。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值