Hi
ich habe in einem beispielprogramm (asm) folgende zeilen gefunden, die ich überhaupt nicht verstehe:
fmt: .asciz "%c"
sethi %hi(fmt), %l2
or %l2, %lo(fmt), %l2
also mein problem ist, dass ich keine ahnung hab, was nun im register %l2 steht.
Im Register %l2 steht jetzt die Adresse des Strings "%c"
aha, und danke für die schnelle antwort
und was soll die zeile
or %l2, %lo(fmt), %l2
in %lo steht ja nichts, also würd sich in dem register %l2 nichts ändern…….oder doch?
%lo ist nicht %l0, vorsicht. %lo ist ein Makro, welches die unteren 10 Bit der Adresse in Klammern rausholt. Das Problem ist dass man nicht einen 32-Bit-Wert wie Adressen es sind in ein Register holen kann. Dazu holt man erst die oberen 22 Bit in das Register mit dem sethi-Befehl, dieser setzt die unteren 10 Bit dann auf 0. Wenn man das getan hat muss man danach noch die letzten 10 Bit dazuholen. Das macht man mit dem or, da die unteren 10 bit 0 sind, hat man am Ende die ganze 32-Bit-Zahl im Register.
ah, danke, jetzt versteh ich das.
ich dachte, dass dieser or-befehl gar nichts mit dem sethi zutun hat, weil da ein befehl dazwischen war. aber nu ergibt das für mich einen sinn [img]
http://www.fb18.de/gfx/23.gif[/img]
der befehl dazwischen ist vermutlich sein sprung, der ja erst danach ausgeführt eird ;)
hm, eine sache ist mir aber noch nicht klar.
durch printf wird der inhalt von %o1 an den String "%c" rangehängt.
ich versteh nur nicht, warum zum register %o1 vorher 0x30 addiert wird. wenn man die addition weglässt, wird nichts ausgegeben.
(komischer datentyp dieser char)
Das hat ne ganz einfache Ursache: %c gibt ein Zeichen und nicht eine Zahl aus. Wenn man 0x30 addiert wird die 0 genau zum ASCII-Wert von "0", das klappt bis 9, danach kommen einige andere Zeichen und letztendlich Buchstaben. Wenn du eine Zahl ausgeben willst, nimm %d
…und wieder etwas gelernt. danke