Forum: Mikrocontroller und Digitale Elektronik PPC assembler befehl für laden von GPR


von Tobi (Gast)


Lesenswert?

Hallo zusammen,

ich möchte mit assembler befehle eine Konstante 0x12345678 im general 
purpose register GPR5 speichern.
kann mir da jemand ein tip geben wie ich das machen kann?

von Bernhard S. (b_spitzer)


Lesenswert?

GPR ist doch nur die Zusammenfassung aller Arbeitsregister (ohne FPR). 
Die heissen doch dann R0, R1... Ohne genaue Kenntnis des Assemblers 
würde ich mal
li R5, 0x12345678
tippen. Vielleicht hilft das ja:
http://www.ibm.com/developerworks/library/l-powasm1/index.html

von Bernhard S. (b_spitzer)


Lesenswert?

oder doch nur
li 5, 0x12345678

von Tobi (Gast)


Lesenswert?

ok danke das funktioniert.

ich will eigentlich eine C funktion (fcn1) aus einem assembler code 
aufrufen.

                .extern fcn1
fcn2:
                 # save register hier
                 ...

          # call the C extern funktion: dies funktioniert auch gut
    bl fcn1

    li 11, 0
    addi 11, 11, fcn1
    mtspr 9, 11
    bcctrl 0x0,0,0

    #resave the register hier
    ...
    ...
    # und return
    blr

ich bekomme die Fehlermeldung beim compilieren/assemblieren:
 " unsupported relocation against fcn1"
Hat Jemand eine Idee wie man das lösen kann? Ich möchte den instruction 
"bcctrl" damit ich mit dem Count Reigister branchen kann und nicht 
relative branch mit dem "bl"

Danke

von Tobi (Gast)


Lesenswert?

Hat also keiner n Ahnung wie das funktioniert?

von Karl M. (movex)


Lesenswert?

.equ FUNC_ADDR  0x10000


# jump address is in r3
lis  r3,FUNC_ADDR@h
ori  r3,r3,FUNC_ADDR@l
# save into counter reg
mtctr r3
# jump into given address
bctrl

von Tobi (Gast)


Lesenswert?

super danke.
was bedeuten dann die @h und @l in FUNC_ADDR@h und FUNC_ADDR@l.

besten dank

von Tobi (Gast)


Lesenswert?

ok is klar ;)
high und low.

von Tobi (Gast)


Lesenswert?

warrun macht man eigentlich die teilung (high/low)?
gibts in ppc kein Befehl um eine 32bit konstante in Register zu laden?

sowie hier z.B. (die gibt aber eine compiler fehler "unsupported 
relocation against FUNC_ADDR")

.equ FUNC_ADDR  0x10000
lis  r3,FUNC_ADDR


Danke

von Karl M. (movex)


Lesenswert?

Bei einer 32 Bit Inbstruktion kann man keine 32 Bit immediate Data 
laden.
Es gehen ja einige Bits für opcode und Operanden Register drauf.
Daher ist ein load immediate ein 16 bit half word.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.