ppc: Adresse von label laden

02/10/2010 - 09:31 von olk | Report spam
Hallo,

wie kann ich die Adresse eines Labels in ein Register laden?

la %r0, my_label


scheint nicht richtig zu sein,

thx,
Oliver
 

Lesen sie die antworten

#1 Jan Seiffert
02/10/2010 - 14:11 | Warnen spam
olk schrieb:
Hallo,

wie kann ich die Adresse eines Labels in ein Register laden?

la %r0, my_label


scheint nicht richtig zu sein,




PPC hat, wie die meisten RISC archs, ein instruction encoding mit fester laenge.
Das macht zwar den Instruktionsdekoder einfach, aber so kann man keine grossen
Konstanten behandeln. M68K FTW!
Auf PPC bleibt in der Instruktion Platz fuer nur ca. 16 Bit Konstante.

Was du willst/musst, ist die Adresse des Labels entweder berechnen (hat deine
ABI sowieso irgendeinen Pointer zu einer Funktion in den Registern?), oder in
zwei Schritten laden:
lis %r0,
addic %r0, %r0,

lis ist die Kurzform fuer "addis r, 0, value". Das Problem ist jetzt grad: Ich
weiss nicht wie man deinem Assambler verklickert das du einmal die oberen 16 Bit
der Adresse haben willst und einmal die unteren. Bei gas ist das dieses @ha & @l

Wenn du eh einen Pointer z.B. zum Funktionsstart von my_func in z.B. %r3 hast
koennte das gehen:
lwz %r0, my_label-my_func(%r3)
Du solltest dann natuerlich nicht mehr als 32k in my_func sein (der offset wird
sign extended).

thx,
Oliver



Gruss
Jan

const int TEN; /* Mine goes to eleven */

Ähnliche fragen