assembly - PowerPC组件立即加载

标签 assembly powerpc

我是PowerPC组装的新手。我正在使用MPC8245(是,旧学校)。这是603e系列处理器。

我想知道如何创建立即16位值是'unsigned'的立即加载指令。

示例:li r3,0xFC10

我使用的gcc交叉编译器4.4.5不允许此指令,因为该值不是有符号常量。

是的,我可以使用减2-s补码,但这会使阅读和记录代码变得更加困难。当加载设备寄存器的位字段时,在指令中具有确切的位字段更容易阅读。

最佳答案

li是一个伪操作码,实际上可以转换为addi指令。
addi rD, rA, SIMM将带符号的立即SIMM添加到rA中,并将结果放置在rD中,但rA字段为0时除外,在这种情况下,它指定文字0而不是r0li rD, SIMM实际上是addi rD, 0, SIMM

这对于将0-0x7fff0xffff8000-0xffffffff中的值加载到寄存器中非常有用,但不能将其他值加载到寄存器中。

立即按位操作操作码(ori等)会将16位立即数字段解释为无符号值。但是,它们没有r0的“0意味着字面的addi”行为。

您将需要使用两条指令将0xfc10常数加载到寄存器中:使用li(或lis,就像您加载任意32位常数的上半​​部分一样)将寄存器加载为0,然后在无符号的位置进行OR运算。带ori的16位值。

这正是gcc在这种情况下的作用:

$ cat test.c
unsigned int test(void)
{
    return 0xfc10;
}
$ gcc -O2 -c test.c
$ objdump -d test.o

test.o:     file format elf32-powerpc

Disassembly of section .text:

00000000 <test>:
   0:   38 60 00 00     li      r3,0
   4:   60 63 fc 10     ori     r3,r3,64528
   8:   4e 80 00 20     blr
   c:   60 00 00 00     nop
$

我认为GNU汇编程序无法为PowerPC汇编时自动生成两条指令来从一条源指令中加载这样的值。但是,您可以使用@h@l后缀来提取常数的(无符号)高和低16位半部分,例如:
lis r3, 0x12345678@h            /* => li  r3, 0x1234     */
ori r3, r3, 0x12345678@l        /* => ori r3, r3, 0x5678 */

您可以使用它来编写自己的宏以进行任意常量加载...
$ cat test2.s
        .macro  load_const rD, const
        .if (\const >= -0x8000) && (\const <= 0x7fff)
        li      \rD, \const
        .else
        lis     \rD, \const@h
        ori     \rD, \rD, \const@l
        .endif
        .endm

        load_const r3, 0
        load_const r4, 1
        load_const r5, -1
        load_const r6, 0x7fff
        load_const r7, 0x8000
        load_const r8, -32767
        load_const r9, -32768
        load_const r10, -32769
        load_const r11, 0xfc10

$ as -mregnames -o test2.o test2.s
$ objdump -d test2.o

test2.o:     file format elf32-powerpc

Disassembly of section .text:

00000000 <.text>:
   0:   38 60 00 00     li      r3,0
   4:   38 80 00 01     li      r4,1
   8:   38 a0 ff ff     li      r5,-1
   c:   38 c0 7f ff     li      r6,32767
  10:   3c e0 00 00     lis     r7,0
  14:   60 e7 80 00     ori     r7,r7,32768
  18:   39 00 80 01     li      r8,-32767
  1c:   39 20 80 00     li      r9,-32768
  20:   3d 40 ff ff     lis     r10,-1
  24:   61 4a 7f ff     ori     r10,r10,32767
  28:   3d 60 00 00     lis     r11,0
  2c:   61 6b fc 10     ori     r11,r11,64528
$ 

关于assembly - PowerPC组件立即加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145812/

相关文章:

assembly - 汇编 x86 中整数之间的除法

xcode - 在 XCode 4(或 Xcode 5 或 Xcode 6)中查看反汇编

Power8 上的 OpenMP SIMD

linux - 针对程序集系统调用不支持重定位错误

我可以让编译器优化结构中的函数调用吗?

assembly - 在屏幕上移动对象的最佳方式是什么?

assembly - 与 NASM 打个近亲电话

linux-kernel - 如何在 PPC Linux 上运行时 Hook 系统调用表?

linux - 将软件包移植到 powerpc 需要什么工具?

assembly - 如何读取 PPC 操作码 'extrwi'