Hallo boys and girls,
ich habe ein sehr sehr sehr grosses Problem *rofl* *gg*. ^^.
Nein ernsthaft. ich moechte 2 32bit Register mit printf ausgeben. weiß aber nicht wie. Kann mir jemand biiiiiiiiitte helfen.
ich moechte 2 32bit Register mit printf ausgeben.
1. Lade die Adresse eines Strings mit dem Inhalt "%i %i\n" nach %o0.
2. Kopiere den Inhalt des ersten auszugebenden Registers nach %o1.
3. Kopiere den Inhalt des zweiten auszugebenden Registers nach %o2.
4. call printf
5. nop
[offtopic]
So, geholfen wurde, nun zum Ernst der Thematik:
[/offtopic]
ich habe ein sehr sehr sehr grosses Problem *rofl* *gg*. ^^.
Man sieht es. [9]
Code sollte in etwa so aussehen:
.section ".text"
;...
set ausgabe, %o0
mov %l1, %o1 ; %l1 durch Dein Register1 ersetzen
mov %l2, %o2 ; %l2 durch Dein Register2 ersetzen
call printf
nop
;...
.section ".rodata"
ausgabe: "%i %i\n"
Habs aber nicht kompiliert geschweige denn getestet.
Dies ist unser Code. Wir möchten die beiden Teile der 64 Bit Zahl als Dezimalzahl
im string ausgeben. Das Ergebnis sind momentan jedoch zwei einzelne Dezimalzahlen von denen die eine die höherwetigen Bits (%y) zurückgibt und die andere die niederwertigen Bits (%lo).
.global main
.global printf
.section ".data"
A: .word 4294967295
Z: .asciz "%i%i\n"
.section ".text"
main:
set A, %g2
ld [%g2], %g2
smul %g2, 4, %l0 ! Produkt > 32Bit
rd %y, %o2 ! Aulesen des Y Registers -> %o2
mov %l0, %o1 !Niederwertige Bits nach %o1
set Z, %o0
call printf
nop
ta 0
Thx
Wir möchten die beiden Teile der 64 Bit Zahl als Dezimalzahl im string ausgeben.
Ihr möchtet einfach eine 64 Bit Zahl ausgeben oder was? Dafür gibt es %ll
Und verstehe ich das richtig, Ihr möchtet -1*4 ausrechnen? smul steht für signed multiplication, und 4294967295 ist ja -1 wenn mich nicht alles täuscht. Ob das %ll jetzt signed oder unsigned ausgibt weiss ich nicht, vermutlich aber signed.
.global main
.global printf
.section ".data"
Z: .asciz "%ll\n"
.section ".text"
main:
set 4294967295, %g2
smul %g2, 4, %o1 ! Produkt > 32Bit
rd %y, %o2 ! Aulesen des Y Registers -> %o2
set Z, %o0
call printf
nop
ta 0
Bitte ausprobieren und berichten, was passiert.
Danke für die Bemühungen - wir bekommen aber keinen output.
Es muss doch eine Möglichkeit geben eine 64 Bit Zahl dezimal in der Konsole anzuzeigen, oder? Wir suchen weiter.
Doch es funktioniert:
.global main
.global printf
.section ".data"
Z: .asciz "%lld\n"
.section ".text"
main:
set 4294967295, %g2
umul %g2, 4, %o1 ! Produkt > 32Bit
rd %y, %o2 ! Aulesen des Y Registers -> %o2
set Z, %o0
call printf
nop
ta 0
Folgende Ausgabe:
rzdspc10$ a.out
-17179869181
Jetzt muss ich nur noch verstehen wann wie ich das ganze unsigned hinbekomme. Villeicht mit einem "not" :)
Hmm…
3 * 4 ergibt jetzt aber:
rzdspc10$ a.out
51539607552
Du musst %o1 und %o2 vertauschen.
umul %g2, 4, %o2 ! <--- da stand vorher %o1
rd %y, %o1 ! <--- da stand vorher %o2
Wegen unsigned: probier mal %llu statt %lld
Sehr gut,
vielen Dank das läuft jetzt wie am Schnürchen!
Das heißt jetzt also er ließt im printf auf Grund des Platzhalters ("%llu") nun die beiden Output-Register hintereinander aus und interpretiert sie als eine unsigned 64 Bit breite Dezimalzahl. Wenn das so ist dann ist es wunderbar.
Nochmals Thx
er ließt im printf auf Grund des Platzhalters ("%llu") nun die beiden Output-Register hintereinander aus und interpretiert sie als eine unsigned 64 Bit breite Dezimalzahl.
Im Prinzip ist es so, ja.