FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Technische Informatik

Assembler sucks dick mucho

Assembler sucks dick mucho 2007-03-25 00:07
Jangonaut
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.

RE: Assembler sucks dick mucho 2007-03-25 00:17
Fred
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

RE: Assembler sucks dick mucho 2007-03-25 00:21
Viciarg
[offtopic]
So, geholfen wurde, nun zum Ernst der Thematik:
[/offtopic]

ich habe ein sehr sehr sehr grosses Problem *rofl* *gg*. ^^.

Man sieht es. [9]

RE: Assembler sucks dick mucho 2007-03-25 00:22
Fred
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.

RE: Assembler sucks dick mucho 2007-03-25 00:39
Jangonaut
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

RE: Assembler sucks dick mucho 2007-03-25 01:08
Fred
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.

RE: Assembler sucks dick mucho 2007-03-25 01:29
Jangonaut
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.

RE: Assembler sucks dick mucho 2007-03-25 12:35
Anonymer User
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" :)

RE: Assembler sucks dick mucho 2007-03-25 12:44
Anonymer User
Hmm…

3 * 4 ergibt jetzt aber:

rzdspc10$ a.out 51539607552

RE: Assembler sucks dick mucho 2007-03-25 14:49
Fred
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

RE: Assembler sucks dick mucho 2007-03-25 15:22
Anonymer User
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

RE: Assembler sucks dick mucho 2007-03-25 15:36
Fred
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.