powerpc 汇编linux,PowerPc下的寻址模式

本篇文章主要描述了Powerpc的寻址模式,让自己对内存映射、寻址的概念理解深入些。

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

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

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

·较大的数据类型可以通过简单地将多个字节当作一个单位实现(例如,将两个内存位置放到一起作为一个 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。0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018最佳GAN论文回顾(上)

我很高兴今年参加了一个研究项目,这要求我必须熟悉大量用于计算机视觉方面的深度学习领域的资料。我对过去两、三年内取得的进展感到惊讶,这真的非常令人兴奋和鼓舞,所有不同的子领域,如图像修复、对抗性样本、超分辨率或是三维重…

被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变

自从阿法狗战胜人类顶级棋手之后,深度学习、人工智能变得再一次火热起来。有些人认为,深度学习的再一次兴起是源于硬件的提升、数据量的增多以及高效算法的研究。这并不完全精确,有一个基本的误解是更大的数据会产生更好的机器学习结果。然而…

spring整合rabbitMQ最新版

文章目录一、简单对象1. 依赖2. 生产者3. 消费者4. 配置文件5. spring版本二、复杂对象2.1. 生产者2.2. 消费者一、简单对象 1. 依赖 <!--spring整合rabbitmq--><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-ra…

搞定面试算法系列 | 分治算法三步走

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 江子抑转自 | 编程拯救世界主要思想分治算法&#xff0c;即分而治之&#xff1a;把一个复杂问题分成两个或更多的相同或相似子问题&#xff0c;直到最后子问题可以简单地直接求解&#xff0c;最后将子问题的解合并为原问题的…

通过FD耗尽实验谈谈使用HttpClient的正确姿势

一段问题代码实验 在进行网络编程时&#xff0c;正确关闭资源是一件很重要的事。在高并发场景下&#xff0c;未正常关闭的资源数逐渐积累会导致系统资源耗尽&#xff0c;影响系统整体服务能力&#xff0c;但是这件重要的事情往往又容易被忽视。我们进行一个简单的实验&#xf…

与“十“俱进 阿里数据库运维10年演进之路

导语 阿里巴巴集团拥有超大的数据库实例规模&#xff0c;在快速发展的过程中我们在运维管理方面也在不断的面临变化&#xff0c;从物理器到容器、从独占到混布、从本地盘到存储计算分离、从集团内到大促云资源&#xff0c;从开源的MySQL到自研分布式数据库&#xff0c;运维管控…

jmeter 压测 RabbitMQ_单机

文章目录一、MQ压测1. 资料列表2. jmeter软件包3. 插件列表二、远程服务器监控2.1. 监控声明2.2. 监控场景的区别2.3. 软件列表2.4. 插件操作2.5. 软件操作三、jmeter编写MQ脚本3.1.创建线程组3.2. 创建MQ生产者3.3. 创建MQ消费者四、监听器4.1. 聚合报告4.2. 观察树4.3. 监控五…

云+X案例展 | 民生类:纷享销客助力沃得农机构筑智能化、信息化之路

本案例由纷扬科技投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。​​​​“2004年到20…

如何“神还原”数据中心? 阿里联合NTU打造了工业级精度的仿真沙盘!

如何保障数据中心的稳定运行&#xff0c;是多年来一直困扰业界的难题。机房环境如果发生未预期变化&#xff0c;可能造成难以估计的损失。所以我们希望能构建一个“变更沙盘”&#xff0c;在真实变更之前&#xff0c;操作人员可以先在沙盘中进行试变更&#xff0c;若变更效果在…

RabbitMQ 手动签收

下面这基础地方都必须设置&#xff0c;不然无效 // 同一时刻服务器只会发一条消息给消费者channel.basicQos(1); // 消息的标识&#xff0c;false只确认当前一个消息收到&#xff0c;true确认所有consumer获得的消息 channel.basicAck(message.getMessageProperties().getDeli…

把16进制转换为ascii字符c语言,ASCII转16进制C语言

满意答案u2gseftj278推荐于 2016.03.01采纳率&#xff1a;56% 等级&#xff1a;11已帮助&#xff1a;14340人以前引别人的&#xff0c;自己懒得再写了呵呵。原理就是这样的&#xff0c;你可以直接用的//函 数 名&#xff1a;AscToHex()//功能描述&#xff1a;把ASCII转换为1…

四大维度全景揭秘阿里巴巴智能对话开发平台

在阿里巴巴智能服务事业部的X蜂会上&#xff0c;小蜜北京团队的高级算法专家李永彬&#xff08;水德&#xff09;分享了小蜜智能对话开发平台的构建&#xff0c;围绕平台来源、设计理念、核心技术、业务落地情况四大维度讲述了一个较为完整的智能任务型对话开发平台的全景。以下…

2019年技术盘点云数据库篇(二):阿里云携手MongoDB率先上线4.2数据库 云上数据库已是大势所趋...

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;随着技术的飞速发展&#xff0c;云数据库在云计算的大背景下&#xff0c;作为一种新兴的共享基础架构方法逐渐发展起来&#xff0c;它极大地增强了数据…

Oracle 查看表空间的大小及使用情况sql语句

SELECT a.tablespace_name "表空间名称", total / (1024 * 1024) "表空间大小(M)", free / (1024 * 1024) "表空间剩余大小(M)", (total - free) / (1024 * 1024 ) "表空间使用大小(M)", total / (1024 * 1024 * 1024) "表空…

高可用、弹性动态的金融级移动架构在蚂蚁金服的演进之路

本文基于重岳在 2018 年 Arch Summit 北京站的分享内容进行总结&#xff0c;希望通过本篇文章介绍近些年来支付宝在移动端架构的上演进和思考&#xff0c;期冀能给读者们带来些许帮助。 支付宝作为国民级应用&#xff0c;当前全球用户已经超过 10 亿&#xff0c;提供了超过 200…

Android代码混淆方法,Android 代码混淆零基础入门

内容提要本篇文章主要有三个部分&#xff0c;让读者读完后能自己写规则混淆项目对Android代码怎么开启混淆做一个简单的介绍。对混淆规则做一个简单介绍&#xff1b;在混淆过后Crash日志反推代码工具retrace.bat、可视化反推工具GUI说明。对混淆的一个简单介绍&#xff1a;Andr…

oracle查询当前用户名下所有表

--SONARQUBE为用户名&#xff0c;用户名必须是大写 SELECT * from all_tables where ownerSONARQUBE;--查看当前登录的用户的表: SELECT table_name from user_tables;

JUC包中的分而治之策略-为提高性能而生

一、前言 本次分享我们来共同探讨JUC包中一些有意思的类&#xff0c;包含AtomicLong & LongAdder,ThreadLocalRandom原理。 二、AtomicLong & LongAdder 2.1 AtomicLong 类 AtomicLong是JUC包提供的原子性操作类&#xff0c;其内部通过CAS保证了对计数的原子性更新…

galaxy s8 android pc,手机秒变PC!三星Galaxy S8桌面模式曝光

据外媒报道&#xff0c;三星旗舰手机Galaxy S8/S8 Plus在外观上以及硬件配置上已经没有了悬念。不过一些小的改进或者是新功能还是让人对Galaxy S8充满期待。日前&#xff0c;传闻中的Galaxy S8桌面模式终于被曝光。三星Galaxy S8桌面模式曝光(图片来自kkj)报道称&#xff0c;G…

2020年进军 AI,想年薪 40 万,没这个能力不行

前几天&#xff0c;《百度沸点&#xff1a;2019年度科技热词》来了&#xff01;百度沸点&#xff1a;2019年度科技热词 AI排名第一2019年可以说是AI全面落地和商用的一年&#xff0c;产业智能化成为各个行业重点关注的发展方向&#xff0c;交通、工业、农业、医疗等主流行业无一…