指令缩写
-------------------------
st = storeld = load
r = right
l = left 或者 logical
w = word
u = update
m = move
f = from 或者 field
t = to 或者 than
i = Immediate
h = half word
z = zero
b = branch
n = and
cmp = compare
sub = subtract
clr = clear
cr = condition register
lr = link register
ctr = couter register
stwu = STore Word witch Update
stwu r1, <-frame_size>(r1)
--------------------------------
在GDB/IDA汇编中通常写成
stwu %sp, -0×20(%sp)
意思是,先将SP放入到(SP-20)这个内存地址然后SP = SP - 20;
从特殊寄存器取值的扩展助记符
-------------------------
mflr = Move From Link Register
mflr rt 等同于 mfspr rt,8
将连接寄存器的值放到RT
一般是mflr %r0
存值到特殊寄存器的扩展助记符
-------------------------
mtctr = Move To Counter Register
mtctr rs 等同 mtspr 9,rs
将RS的值放入到计数寄存器
mtcrf = Move to Condition Register Fields mtcrf FXM, RS按照掩码FXM,复制Rs的内容到CR
FXM是8位,控制 RS的32位(8组,共32位)复制过去,也就是说 FXM的1位,可以控制Rs的4位一位掩码控制一组CR
条件寄存器扩展助记符
-------------------------
crclr = Control Register CLeaR
crclr bx 等同于 crxor bx, bx, bx 作用是将条件寄存器相应的位清零
例如
crclr so 等同于 crxor 3, 3, 3 将CR0的SO位(第3位)清零
crclr 4*cr3+eq 等同于 crxor 14, 14, 14 将CR3的EQ位清零
比较指令
-------------------------
cmpli = Compare Logical Immediate
cmplwi bf, ra, ui 等同于 cmpli bf, 0, ra, ui
Compare Logical Word Immediate
所谓逻辑比较,就是同无符号整数比较
存储指令
-------------------------
sth = Store Half 并且是存储高位 (16-31位)
载入指令
-------------------------
lhz = Load Half and Zero 载入半字并将高16位清零
lwzx = Load Word and Zero Indexed 意思 是 lwzx RT, RA, RB (Ra+Rb就是 地址)
跳转
-------------------------
bccl = bctrl (有别名的助记符)
Branch Conditional to Count Register
条件跳转到计数寄存器指定的地址
逻辑操作
-------------------------
ori 或者 oril = OR Immediate 同16位立即数进行或操作
循环掩码操作
循环左移然后进行掩码操作是PowerPC指令集的精华,包含了一组非常强大的指令集
移位指令
-------------------------
slwi = Shift left immediate 左移几位(位数用立即数表示)
rotlwi = Rotate left immediate 循环左移
抽取
-------------------------
extrwi = Extract and right justify immediate
例如 extrwi RX, RY, 1, 0
等同于 rlwinm RX, RY, 1, 31, 31
rlwinm or rlinm (Rotate Left Word Immediate Then AND with Mask)
清除
-------------------------
clrlwi = Clear left immediate
怪异清除
-------------------------
clrlslwi = Clear (Left Word) and Shift Left clrlslwi %r0, %r0, 24,8 等同于
rlwinm RA, RS, 24-8, 31-24 =
rlwinm Ra, Rs, 16, 7
rlwinm RA, RS, SH, MB, ME
将R0向左循环移动掩码是 [8, 15]
影响CR的运算
-------------------------
如果Overflow Exception(OE)设置1,那么结果影响定点异常寄存器的Summary Overflow(SO)和 Overflow(OV),助记符是后面加o, addo
如 果Record(Rc)设置1,那么结果影响Less Than(LT) zero, Greater Than (GT) zero, Equal To (EQ) zero,和Summary Overflow (SO)等条件寄存器CR助记符是后面加”点” add.
算术运算
-------------------------
注意方向
subf = Subtract From 注意,被减数是后面的那个寄存器
计数器循环
-------------------------
在扩展助记符中,计数寄存器的语义可以通过在b后面立即添加dz或 dnz来指定。
符号扩展
-------------------------
extsb
将最右边的8位保存,左边的24位清零或者置1(依赖于右边8位的最高位)
算术运算
-------------------------
除法 divwu (Divide Word Unsigned)
乘法 mullw(Multiple Low Word)
装入立即数
-------------------------
li只能装入16位即时值。您不能只通过一条指令就将一个32位的指针装入GPR。您必须使用两条指令,首先装入高16位,然后是低16位。那恰恰就是@ha("高")和 @l("低")后缀的用途。(@ha的"a"部分处理符号扩展。)
为方便起见,lis(表示"装入即时移位")将直接装入到GPR的高16位。然后余下的所有操作是添加较低位。