PowerPC汇编语言

转载 2012年04月05日 19:26:42

在了解指令集本身之前,有两项关于汇编语言的关键内容需要理解,也就是内存模型和获取-执行周期。

内存模型非常简单。内存只存储一种东西 —— 固定范围内的数字,也称为字节(在大多数计算机上,这是一个 0 到 255 之间的数字)。每个存储单元都使用一个有序地址定位。设想一个庞大的空间,其中有许多信箱。每个信箱都有编号,且大小相同。这是计算机能够存储的惟一 内容。因此,所有一切最终都必须存储为固定范围内的数字。幸运的是,大多数处理器都能够将多个字节结合成一个单元来处理大数和具有不同取值范围的数字(例如浮点数)。但特定指令处理一块内存的方式与这样一个事实无关:每个存储单元都以完全相同的方式存储。除了内存按有序地址定位之外,处理器还维护着一组寄存器,这是容纳被操纵的数据或配置开关的临时位置。

控制处理器的基本过程就上获取-执行周期。处理器有一个称为程序计数器的寄存器,容纳要执行的下一条指令的地址。获取-执行的工作方式如下:

  • 读程序计数器,从其中列出的地址处读取指令
  • 更新程序计数器,使之指向下一条指令
  • 解码指令
  • 加载处理该指令所需的全部内存项
  • 处理计算
  • 储存结果

完成这一切的实际原理极其复杂,特别是 POWER5 处理器可同步处理多达 5 条的指令。但上述介绍对于构思模型来说已足够。

PowerPC 体系结构按特征可表述为加载/存储 体系结构。这也就意味着,所有的计算都是在寄存器中完成的,而不是主存储器中。在将数据载入寄存器以及将寄存器中的数据存入内存时的内存访问非常简单。这与 x86 体系结构(比如说)不同,其中几乎每条指令都可对内存、寄存器或两者同时进行操作。加载/存储体系结构通常具有许多通用的寄存器。PowerPC 具有 32 个通用寄存器和 32 个浮点寄存器,每个寄存器都有编号(与 x86 完全不同,x86 为寄存器命名而不是编号)。操作系统的 ABI(应用程序二进制接口)可能主要使用通用寄存器。还有一些专用寄存器用于容纳状态信息并返回地址。管理级应用程序还可使用其他一些专用寄存器,但这些内容不在本文讨论之列。通用寄存器在 32 位体系结构中是 32 位的,在 64 位体系结构中则是 64 位的。本文主要关注 64 位体系结构。

汇编语言中的指令非常低级 —— 它们一次只能执行一项(有时可能是为数不多的几项)操作。例如,在 C 语言中可以写 d = a + b + c - d + some_function(e, f - g),但在汇编语言中,每一次加、减和函数调用操作都必须使用自己的指令,实际上函数调用可能需要使用几条指令。有时这看上去冗长麻烦。但有三个重要的优点。第一,简单了解汇编语言能够帮助您编写出更好的高级代码,因为这样您就可以了解较低的级别上究竟发生了什么。第二,能够处理汇编语言中的所有细节这一事实意味着您能够优化速度关键型循环,而且比编译器做得更出色。编译器十分擅长代码优化。但了解汇编语言可帮助您理解编译器进行的优化(在 gcc 中使用 -S 开关将使编译器生成汇编代码而不是对象代码),并且还能帮您找到编译器遗漏的地方。第三,您能够充分利用 PowerPC 芯片的强大力量,实际上这往往会使您的代码比高级语言中的代码更为简洁。

这里不再进一步解释,接下来让我们开始研究 PowerPC 指令集。下面给出了一些对新手很有帮助的 PowerPC 指令:

li REG, VALUE

加载寄存器 REG,数字为 VALUE

add REGA, REGB, REGC

将 REGB 与 REGC 相加,并将结果存储在 REGA 中

addi REGA, REGB, VALUE

将数字 VALUE 与 REGB 相加,并将结果存储在 REGA 中

mr REGA, REGB

将 REGB 中的值复制到 REGA 中

or REGA, REGB, REGC

对 REGB 和 REGC 执行逻辑 “或” 运算,并将结果存储在 REGA 中

ori REGA, REGB, VALUE

对 REGB 和 VALUE 执行逻辑 “或” 运算,并将结果存储在 REGA 中

and, andi, xor, xori, nand, nand, and nor

其他所有此类逻辑运算都遵循与 “or” 或 “ori” 相同的模式

ld REGA, 0(REGB)

使用 REGB 的内容作为要载入 REGA 的值的内存地址

lbz, lhz, and lwz

它们均采用相同的格式,但分别操作字节、半字和字(“z” 表示它们还会清除该寄存器中的其他内容)

b ADDRESS

跳转(或转移)到地址 ADDRESS 处的指令

bl ADDRESS

对地址 ADDRESS 的子例程调用

cmpd REGA, REGB

比较 REGA 和 REGB 的内容,并恰当地设置状态寄存器的各位

beq ADDRESS

若之前比较过的寄存器内容等同,则跳转到 ADDRESS

bne, blt, bgt, ble, and bge

它们均采用相同的形式,但分别检查不等、小于、大于、小于等于和大于等于

std REGA, 0(REGB)

使用 REGB 的地址作为保存 REGA 的值的内存地址

stb, sth, and stw

它们均采用相同的格式,但分别操作字节、半字和字

sc

对内核进行系统调用

注意到,所有计算值的指令均以第一个操作数作为目标寄存器。在所有这些指令中,寄存器都仅用数字指定。例如,将数字 12 载入寄存器 5 的指令是 li 5, 12。我们知道,5 表示一个寄存器,12 表示数字 12,原因在于指令格式 —— 没有其他指示符。

每条 PowerPC 指令的长度都是 32 位。前 6 位确定具体指令,其他各位根据指令的不同而具有不同功能。指令长度固定这一事实使处理器更够更有效地处理指令。但 32 位这一限制可能会带来一些麻烦,后文中您将会看到。大多数此类麻烦的解决方法将在本系列的第 2 部分中讨论。

上述指令中有许多都利用了 PowerPC 的扩展记忆法。也就是说,它们实际上是一条更为通用的指令的特殊形式。例如,上述所有条件跳转指令实际上都是bc(branch conditional)指令的特殊形式。bc 指令的形式是 bc MODE, CBIT, ADDRESSCBIT 是条件寄存器要测试的位。MODE 有许多有趣的用途,但为简化使用,若您希望在条件位得到设置时跳转,则将其设置为 12;若希望在条件位未得到设置时跳转,则将其设置为 4。部分重要的条件寄存器位包括:表示小于的 8、表示大于的 9、表示相等的 10。因此,指令beq ADDRESS 实际上就是 bc 12, 10 ADDRESS。类似地,liaddi 的特殊形式,mror 的特殊形式。这些扩展的记忆法有助于使 PowerPC 汇编语言程序更具可读性,并且能够编写出更简单的程序,同时也不会抵消更高级的程序和程序员可以利用的强大能力。


powerpc 汇编编程参考

POWER5 处理器是一款应用广泛的 64 位高性能处理器。具备双核和对称多线程功能。这使单独一个芯片能够同步处理 4 个线程!不仅如此,各线程在每个时钟周期内还可执行一组指令(最多可达到 5 条)。...
  • xxxl
  • xxxl
  • 2015年01月31日 18:21
  • 1464

Powerpc汇编学习之一

POWER5 处理器是一款应用广泛的 64 位高性能处理器。具备双核和对称多线程功能。这使单独一个芯片能够同步处理 4 个线程!不仅如此,各线程在每个时钟周期内还可执行一组指令(最多可达到 5 条)。...
  • jackyard
  • jackyard
  • 2013年01月21日 13:50
  • 1293

PowerPc 架构 及 汇编指令 之二 PowerPC 汇编语言

PowerPC 汇编语言1  条件寄存器,比较指令 和 条件跳转指令CR(Condition Register) 一共32位,从低位到高位被分成 CR0-CR7八段,每段四位。每个四位的CRn从...
  • maxwell_air
  • maxwell_air
  • 2011年05月27日 15:34
  • 613

PowerPC汇编语言

在了解指令集本身之前,有两项关于汇编语言的关键内容需要理解,也就是内存模型和获取-执行周期。 内存模型非常简单。内存只存储一种东西 —— 固定范围内的数字,也称为字节(在大多数计算机上,这是一个 0...
  • liningustb123
  • liningustb123
  • 2012年03月28日 14:52
  • 261

PowerPC 32位汇编入门讲解

最近有个操作系统移植的项目,老师让先看看PowerPC的东西,这篇我觉得写得不错,这个作者的博客很有参考价值。...
  • hahajinbu
  • hahajinbu
  • 2015年12月16日 13:52
  • 1359

PowerPC汇编指令集简析-(1)

在了解PowerPC汇编指令前,需要先看下编程所用的寄存器模型,PowerPC系统结构为大多数运算指令都定义了Register-Register的操作,这些操作的源操作数从寄存器取得,或作为嵌入指令操...
  • JuanA1
  • JuanA1
  • 2011年09月25日 14:33
  • 15320

[Freescale MPC]同步指令eieio、isync、sync简介

Freescale 的MPC系列提供同步指令eieio、isync、sync,以及lwarx(Load Word and Reserve Indexed) 、stwcx(Store Word Cond...
  • hunwo
  • hunwo
  • 2011年08月31日 16:27
  • 1583

powerpc汇编指令分析

1基础知识   ØVxworks shell命令   i b&bh&bdall c ti&tt cret:执行到子函数返回,返回后的结果可以在r3寄存器里看到。先b断住子函数,然后用c...
  • hope_worker
  • hope_worker
  • 2014年07月12日 08:09
  • 3975

转载一篇关于POWERPC中断比较全面的讲解

从CPU的e500核的角度,中断源分为自己内核产生的异常和 PIC提供的中断。   异常,是e500核产生的,它是同步产生的(可以预知的),如非法指令,或访问存储器时出现TLB Miss等情况 中断,...
  • zssmcu
  • zssmcu
  • 2013年05月15日 16:50
  • 1491

U-boot源代码全分析系列(基于PowerPC)

一、概述     U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目,是从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的。其源码目录、编...
  • AA0210AA
  • AA0210AA
  • 2015年03月28日 12:07
  • 1056
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PowerPC汇编语言
举报原因:
原因补充:

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