2012-06-21 28 views
5

PowerPC aksamında yeniyim. Bir MPC8245 (evet, eski okul) ile çalışıyorum. Bu 603e aile işlemcisi.PowerPC Montajı Yüklemesi Hemen

Hemen 16 bit değerinin "imzasız" olduğu bir yükleme anında talimatı nasıl oluşturacağımı bilmek istiyorum.

Örnek: li r3,0xFC10

gcc çapraz derleyici, 4.4.5, ben değeri sabit imzalanan olmadığından bu talimatı izin vermez kullanıyorum.

Evet, eksi 2 s ekini kullanabilirim, ancak bu kodu okuyup belgelemeyi zorlaştırır. Cihaz kayıtları için bit alanlarını yüklerken, talimatlarda tam bit alanlarına sahip olmak daha kolay okunur.

+0

-1008 0xFC10 ile aynı 2'nin tamamlama temsilcisine sahiptir.Belki sen yazabilirsin (0xfc10-0x10000)? –

+0

Veya el ile 0xFFFFFC10 için uzatın? –

+0

@tc - İlginç. Li komutu sadece 16 bitlik değerleri kabul etse de, r3,0xFFFFFC10 yasal bir talimattır. – KeithSmith

cevap

10

li aslında bir addi yönergesi olarak çeviren bir sözde-opcode'dur. rA alan bir edebi 0 yerine r0 ait belirten bu durumda, 0 olduğunda

addi rD, rA, SIMM hariç rD, yerleştirmektir SIMMrA anında imzalı ekler. li rD, SIMM gerçekten addi rD, 0, SIMM'dur.

Bu değer, 0 - 0x7fff ve 0xffff8000 - 0xffffffff değerleri için bir kayıt içine, ancak diğer değerlere yüklenmek için iyidir.

Anlık bitsel işlem opcodes (ori vb.), 16 bitlik anında alanı işaretsiz bir değer olarak yorumluyor. Ancak, "r0, literal anlamına gelir" addi davranışı yoktur.

Bir kayıt içine 0xfc10 bir sabiti yüklemek için iki talimatları kullanmak gerekir: (eğer keyfi bir 32 bit sabit üst yarısını yerleştirir gibi, ya lis) li kullanarak 0 ile kayıt yüklemek ve daha sonra VEYA, ori ile işaretsiz 16 bit değerinde.

$ 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 
$ 

Ben GNU montajcı tek böyle bir değeri yüklemek için otomatik olarak iki talimatları oluşturmaya dönük tüm yol var sanmıyorum:

Bu

gcc şartlar altında ne yaptığını tam olarak PowerPC için montaj sırasında kaynak talimatı. Eğer bir sabit, örneğin (imzasız) yüksek ve düşük 16 bit yarısını çıkarmak için @h ve @l son eklerini kullanabilirsiniz Ancak:

lis r3, [email protected]   /* => li r3, 0x1234  */ 
ori r3, r3, [email protected]  /* => ori r3, r3, 0x5678 */ 

Sen keyfi sabit yükleme için kendi makro yazmak için kullanabilir .. .

$ cat test2.s 
     .macro load_const rD, const 
     .if (\const >= -0x8000) && (\const <= 0x7fff) 
     li  \rD, \const 
     .else 
     lis  \rD, \[email protected] 
     ori  \rD, \rD, \[email protected] 
     .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 
$ 
+0

Matt - Tam cevap için teşekkür ederim. Kullandığım yapı ortamı "lwi" makrosuna sahip. "Li" ile işaretsiz bir değer kullanırken gcc tarafından bildirilen hata "Hata: işlenen aralık dışında (0x00008000 0xffff8000 ile 0x00007fff arasında değil)" yukarıda belirtildiği gibi. – KeithSmith

0

Ayrıca operatörü ori kullanarak acil işaretsiz 16-bit yüklemek, ancak önce kayıt temizlemek için emin olabilir:

xor r3, r3, r3 
ori r3, r3, 0xFC10