10

PowerPCアセンブリは初めてです。私はMPC8245を使用しています(はい、古い学校です)。これは603eファミリのプロセッサです。

イミディエート16ビット値が「unsigned」であるロードイミディエート命令を作成する方法を知りたいです。

例:li r3,0xFC10

私が使用しているgccクロスコンパイラ4.4.5では、値が符号付き定数ではないため、この命令は許可されていません。

はい、マイナス2の補数を使用できますが、これによりコードの読み取りと文書化がより困難になります。デバイスレジスタのビットフィールドをロードする場合、命令に正確なビットフィールドを含めるとはるかに読みやすくなります。

4

2 に答える 2

19

liは、実際に命令として変換される疑似オペコードaddiです。

addi rD, rA, SIMM符号付きイミディエートSIMMをに追加しrA、結果をに配置しますrDただしrAフィールドが0の場合は、。の代わりにリテラル0を指定しますr0li rD, SIMM本当にaddi rD, 0, SIMMです。

0これは、 -0x7fffおよび0xffff8000-から0xffffffffレジスタに値をロードするのに適していますが、他の値には適していません。

即値演算オペコード(oriなど)は、16ビットの即値フィールドを符号なしの値として解釈します。r0ただし、「は文字通りの0」動作を意味しませんaddi

の定数をレジスタにロードするには、2つの命令を使用する必要があります0xfc10。0を使用してレジスタをロードしli(またはlis、任意の32ビット定数の上半分をロードしているかのように)、符号なし16ビットでORを実行します。の値ori

これはまさに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用にアセンブルするときに、単一のソース命令からそのような値をロードするために2つの命令を自動的に生成する方法を持っていないと思います。ただし、@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
$ 
于 2012-06-21T22:01:21.770 に答える
1

演算子を使用して符号なし16ビットをすぐにロードすることもできますが、次のori前に必ずレジスタをクリアしてください。

xor r3, r3, r3
ori r3, r3, 0xFC10
于 2015-09-22T13:08:24.517 に答える