PowerPc下的寻址模式

原创 2011年09月25日 16:13:16

    本篇文章主要描述了Powerpc的寻址模式,让自己对内存映射、寻址的概念理解深入些。其中大量借鉴了http://www.yuanma.org/data/2007/0312/article_2406.htm处的文章,还望谅解。

    在开始讨论寻址模式之前,让我们首先来回顾一下计算机内存的概念。可能之前已经了解了关于内存和编程的一些事实,但是由于现代编程语言正试图淡化计算机中的一些物理概念,因此复习一下相关内容是很有用的:

·主存中的每个位置都使用的连续的数字地址编号,内存位置就使用这个地址来引用。

·每个主存位置的长度都是一个字节。

·较大的数据类型可以通过简单地将多个字节当作一个单位实现(例如,将两个内存位置放到一起作为一个 16 位的数字)。

·寄存器的长度在32位平台上是4个字节,64位8个。

·每次可以加载1、2、4、8个字节的内存到寄存器。

·非数字数据可以作为数字数据进行存储---惟一的区别在于可以对这些数据执行哪些操作,以及如何使用这些数据。

    新接触汇编语言的程序员有时可能会对我们有多少访问内存的方法感到惊奇。这些不同的方法就称为寻址模式。 有些模式逻辑上是等价的,但是用途却不同。它们之所以被视为不同的寻址模式,原因在于它们可能根据处理器采用了不同的实现。

    有两种寻址模式实际上根本就不会访问内存。在立即寻址模式中,要使用的数据是指令的一部分(例如 li 指令就表示 “立即加载”,这是因为要加载的数字就是这条指令本身 的一部分)。在寄存器寻址模式 中,我们也不会访问主存的内容,而是访问寄存器。

    访问主存最显而易见的寻址模式为直接寻址模式。在这种模式中,指令本身就包含了数据加载的源地址,该模式通常用于全局变量访问、分支以及子程序调用。稍简单的模式为相对寻址模式,它会根据当前程序计数器来计算地址。这通常用于短程分支,其中目标地址距当前位置很近,因此指定一个偏移量(而非绝对地址)会更有意义。这就像是直接寻址模式的最终地址在汇编或链接时就知道了一样。

    索引寻址模式对于全局变量访问数字元素来说是最为有效地一种方式。它包括两个部分:一个内存地址以及一个索引寄存器。索引寄存器会与某个指定的地址相加,结果用作访问内存时使用的地址。有些平台(非 PowerPC)允许程序员为索引寄存器指定一个倍数。因此,如果每个数组元素的长度都是 8 个字节,那么我们就可以使用 8 作为倍数。这样就可以将索引寄存器当作数组索引来使用。否则,就必须按照数据大小来增加或减少索引寄存器了。

    寄存器间接寻址模式使用一个寄存器来指定内存访问的整个地址,这种模式在很多情况中都会使用,包括:

    1、解除指针变量的引用;

    2、使用其他模式无法进行的内存访问(地址可以通过其他方式进行计算,并存储到寄存器中,然后使用这个值来访问内存)。

    基地址寻址模式的工作方式与索引寻址模式非常类似(指定的数字和寄存器被加在一起得到最终地址),但两个元素的作用交换了。在基地址寻址模式中,寄存器中保存的是基址,数字是偏移量。这对于访问结构中的成员是非常有用的。寄存器可以存放整个结构的地址,数字部分可以根据所访问的结构成员进行修改。

    这里假设我们有一个包括 3 个域的结构体:第一个域是 8 个字节,第二个域是 4 个字节,最后一个域是 8 个字节。然后,假设这个结构体本身的地址在一个名为 X 的寄存器中。如果我们希望访问这个结构体的第二个元素,就需要在寄存器中的值上加上 8。因此,使用基指针寻址模式,我们可以指定寄存器 X 作为基指针,8 作为偏移量。要访问第三个域,我们需要指定寄存器 X 作为指针,12 作为偏移量。要访问第一个域,我们实际上可以使用间接寻址模式,而不用使用基指针寻址模式,因为这里没有偏移量(这就是为什么在很多平台上第一个结构体成员都是访问最快的一个成员;我们可以使用更加简单的寻址模式 —— 在 PowerPC 上这并不重要)。

    最后,在索引寄存器间接寻址模式中,基址和索引都保存在寄存器中,所使用的内存地址是通过将这两个寄存器加在一起来确定的。

指令格式的重要性

    为了解寻址模式对于 PowerPC 处理器上的加载和存储指令是如何工作的,我们必须先要对 PowerPC 指令格式有点了解。PowerPc使用了加载/存储(也叫RISC)指令集,这意味着访问主存的唯一时机是将内存加载到寄存器或将寄存器中的内容复制到内存中时。所有实际的处理都发生在寄存器之间(或 寄存器和立即寻址模式操作数之间)。另外一种主要的处理器体系结构 CISC(x86 处理器就是一种流行的 CISC 指令集)几乎允许在每条指令中进行内存访问。采用加载/存储体系架构的原因是这样可以使处理器的其他操作更加有效。实际上,现代 CISC 处理器将自己的指令转换成了内部使用的 RISC 格式,以实现更高的效率。

    PowerPc上的每条指令都正好是32位长的,指令的opcode(操 作符,告诉处理器这条指令是什么的代码)占据了前6位。这个32位的长度包含了所有的立即寻址模式的值、寄存器引用、显式地址以及指令选项。这实现了非常好的压缩。实际上,内存地址对于任何指令格式可以使用的最大长度只有24位,最大只能为我们提供16Mb的可寻址空间。但不要担心 —— 有很多方法都可以解决这个问题。这只是为了说明为什么指令格式在 PowerPC 处理器上是如此重要 —— 我们需要知道自己到底需要使用多少空间!

    其实不必记住所有的指令格式就能使用它们。然而,了解一些指令的基本知识可以帮助我们读懂 PowerPC 文档,并理解 PowerPC 指令集中的通用策略和一些细微区别。PowerPC 一共有 15 种不同的指令格式,很多指令格式都有几种子格式。但只需要关心其中的几种即可。下面看下基址用于寻址的指令格式:

使用D-Form和DS-Form指令格式对内存寻址

    D-Form指令是主要的内存访问指令格式之一,它格式如下:

0-5位:操作码

6-10位:源/目标寄存器

11-15位:地址/索引寄存器/操作数

16-31位:数字地址、偏移量或立即寻址模式值

    此格式可用来加载、存储和立即寻址模式的计算,可用于包括立即寻址模式、直接寻址模式(指定地址/索引寄存器为0)、索引寻址模式、间接寻址模式(指定地址为0)和基地址寻址模式等寻址方式。

    D-Form指令非常灵活,可用于任何寄存器加地址的内存访问模式。然而,对于直接寻址和索引寻址来说,它的用处就比较有限了,因为它只能使用一个16位的地址域,所以其提供的最大寻址范围是64K。对于立即寻址、间接寻址和基地址寻址模式,基存储器可以保存64位的地址范围,所以基本不受限制。

    DS-Form只在64位指令中使用,它和D-Form类似,不同的是它使用地址的最后两位为扩展操作符,然而,它会在地址的值部分最右边加上两个0,其范围与D-Form指令相同(64K),但却将其限制位32位对其的内存。

使用D-Form和DS-Form指令格式对内存寻址

    X-Form用于进行索引寄存器间接寻址模式,其中两个寄存器中的值会被加在一起来确定加载/存储的地址。它格式如下:

0-5位:操作码

6-10位:源/目标寄存器

11-15位:地址计算寄存器A

16-20位:地址计算寄存器B

21-30位:扩展操作符

31位:保留未用

    X-Form的优点除了非常灵活外,还为我们提供了非常广泛的寻址范围,在D-Form中,只有一个值及寄存器来指定一个完整的范围。而在X-Form中,由于我们有两个寄存器,这两个组件都可以根据需要指定足够大的范围。因此,在使用基指针寻址模式或索引寻址模式而D-Form固定部分的16位范围太小的情况下,这些值可以存到寄存器中并使用X-Form。

32位保护模式内存寻址原理

阅读: 2,136 内存寻址原理 在做网络安全事件分析的时候,都会遇到内存寻址的知识,例如上次跟大家分享的《 空指针漏洞防护技术》,就涉及到非法访问内存地址的问题。如果这个坎儿迈不过去,你...
  • qq308845474
  • qq308845474
  • 2015年10月11日 22:23
  • 1448

实模式寻址方式

逻辑地址:即逻辑上的地址,实模式下由“段基地址+段内偏移”组成;保护模式下由“段选择符+段内偏移”组成。 线性地址:逻辑地址经分段机制后就成线性地址,它是平坦的;如果不启用分页,那么此线性地址即物理...
  • judyge
  • judyge
  • 2016年08月27日 13:50
  • 632

80x86寻址方式 -- 实模式和保护模式

首先实模式和保护模式是CPU的两种工作模式。一开始PC启动时CPU是工作在实模式下的,经过某种机制后,CPU跳转到保护模式。         Intel 8086是16位CPU,它只有16位寄存器、...
  • u012243115
  • u012243115
  • 2015年06月03日 21:26
  • 830

DirectX11 寻址模式

寻址模式1. 寻址模式是什么?有哪几种?纹理必须与常量插值或线性插值一起使用以形成一个向量值函数T(u,v) = (r,g,b,a)。也就是,当给定一个纹理坐标(u,v)∈[0,1]2时,纹理函数T返...
  • sinat_24229853
  • sinat_24229853
  • 2015年10月03日 23:12
  • 968

纹理寻址模式tex_address_mode

纹理寻址模式tex_address_mode定义在这个纹理层的纹理坐标超过1.0时发生的事情。你可以选择简单格式,一次对全部3个纹理坐标指定寻址模式,或者扩展的格式,使用三分之二的参数每个纹理坐标指定...
  • YESmylady
  • YESmylady
  • 2011年03月03日 10:03
  • 2690

D3D11_TEXTURE_ADDRESS_MODE(纹理寻址模式)

最近在学习D3D11,下面是所查找的一些资料的翻译,如果有什么不合适的地方,欢迎指正。 SamplerState samColor {     Filter = MIN_MAG_MIP_LINEAR;...
  • gggg_ggg
  • gggg_ggg
  • 2014年10月22日 11:49
  • 1755

什么是纹理寻址模式?

    Direct3D程序可以将纹理坐标分配给任何图元的顶点。一般来说,分配的U、V纹理坐标值都在0.0到1.0范围内(包括它们)。但是,如果我们分配了超出这个范围的纹理坐标,可能会得到一些特别的纹...
  • refiner
  • refiner
  • 2006年09月13日 05:21
  • 1347

x86 系列 CPU 内存寻址模式总结

by adie  June 23, 2013, 6:12 p.m. 说明:      S16 表示 16 位段寄存器    P16 表示 16 位的普通寄存器, 立即数, 结果为 16 位...
  • fivedoumi
  • fivedoumi
  • 2016年01月10日 20:32
  • 1235

14.2 I2C寻址模式

上一节介绍的是 I2C 每一位信号的时序流程,而 I2C 通信在字节级的传输中,也有固定的时序要求。I2C 通信的起始信号(Start)后,首先要发送一个从机的地址,这个地址一共有 7位,...
  • softn
  • softn
  • 2016年07月08日 06:18
  • 653

固态硬盘(SSD)扫盲

1、SSD简介 SSD即固态硬盘(Solid State Disk或Solid State Drive),也称作电子硬盘或者固态电子盘,是由控制单元和固态存储单元(DRAM或FLASH芯片)组成的存...
  • yumengkk
  • yumengkk
  • 2011年09月21日 16:47
  • 3948
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PowerPc下的寻址模式
举报原因:
原因补充:

(最多只允许输入30个字)