1. Frage
Was macht dieses Programm:
funktion:
save %sp, -120, %sp
mov %i0, %o0 ! %o0 = x
smul %o0, %o0, %o3
smul %o0, %o3, %o2
sll %o2, 2, %o0
sll %o2, 3, %o1
add %o0, %o1, %o2
sll %o3, 1, %o0
sll %o3, 4, %o1
add %o0, %o1, %o3
add %o3, %o2, %o3
add %o3, 60, %o0
sra %o0, 31, %g1
wr %g0, %g1, %y
nop
nop
nop
sdiv %o0, 18, %i0
jmp %i7+8
restore
Ich bekomme (12x^3+18x^2+60)/18 als Ergebnis raus. richtig??????
Mich verwirrt der Quellcode, wird hier nur das Vorzeichenbit in das Y Register geschrieben?
Um etwa die signed Division durchführen zu können?
sra %o0, 31, %g1
wr %g0, %g1, %y
nop
nop
nop
funktion:
save %sp, -120, %sp
mov %i0, %o0 ! %o0 = x
smul %o0, %o0, %o3 ! %o3=x^2
smul %o0, %o3, %o2 ! %o2=x^3
sll %o2, 2, %o0 ! %o0=4x^3
sll %o2, 3, %o1 ! %o1=8x^3
add %o0, %o1, %o2 ! %o2=4x^3 + 8x^3=12x^3
sll %o3, 1, %o0 ! %o0=2x^2
sll %o3, 4, %o1 ! %o1=16x^2
add %o0, %o1, %o3 ! %o3=2x^2 + 16x^2=18x^2
add %o3, %o2, %o3 ! %o3=18x^2 + 12x^3
add %o3, 60, %o0 ! %o0=18x^2 + 12x^3 + 60
sra %o0, 31, %g1 ! %g1=0 (positiv) oder -1 (negativ)
wr %g0, %g1, %y ! %y=0 xor 0 (positiv) oder -1 (negativ)=0 (positiv) oder -1 (negativ)
nop
nop
nop
sdiv %o0, 18, %i0 ! %i0=(18x^2 + 12x^3 + 60)/18
jmp %i7+8
restore
Ich bekomme (12x^3+18x^2+60)/18 als Ergebnis raus. richtig??????
ich auch
Mich verwirrt der Quellcode, wird hier nur das Vorzeichenbit in das Y Register geschrieben?
Um etwa die signed Division durchführen zu können?
sra %o0, 31, %g1
wr %g0, %g1, %y
nop
nop
nop
das hängt mit der zweierkomplementdarstellung zusammen. mit dem sdiv wird %y vor %o0 gehäng und durch 18 geteilt. steht in %o0 eine negative zahl, müssen - damit sie negativ bleibt - lauter einsen davor gehängt werden (-1 in zweierkomplementdarstellung). steht in %o0 eine positive zahl oder eine null, müssen lauter nullen (0 halt) davor gehäng werden. der sra-befehl schiebt so weit, dass nur noch das vorzeichenbit beachtet wird. da sra arithmetisch verschiebt entsprechen alle eingeschobenen bits dem vorzeichenbit. es steht also 0 bei positiven und -1 bei negativen zahlen in %g1, genau wie es sein soll.
danke für die Antwort T
Hab noch ne Frage
Was macht das Programm:
.global psum
.section ".rodata"
.null: .word 0, 0
.section ".text"
! double psum( int n, double x[], double y[] )
! %i0 -> n
! %i1 -> x[]
! %i2 -> y[]
psum:
save %sp, -120, %sp
sethi %hi(.null), %o0
ldd [%o0 + %lo( .null )], %f4
st %f4, [%fp-16]
st %f4, [%fp-12]
mov %g0, %i5
cmp %g0, %i0
bge .ende
nop
.schleife:
ld [%fp-16], %f8
ld [%fp-12], %f9
mov %i5, %o0
sll %o0, 3, %o1
add %i1, %o1, %g1
ld [%g1], %f4
ld [%g1+4], %f5
add %i2, %o1, %g1
ld [%g1], %f6
ld [%g1+4], %f7
fmuld %f4, %f6, %f4
faddd %f8, %f4, %f4
st %f4, [%fp-16]
st %f5, [%fp-12]
add %i5, 1, %i5
cmp %i5, %i0
bl .schleife
nop
.ende:
ldd [%fp-16], %f4
std %f4, [%fp-8]
fmovs %f4, %f0
fmovs %f5, %f1
jmp %i7+8
restore
Versuche mit Hilfe des Skriptes weiterzukommen, geht aber sehr langsam voran.
Wäre für Tipps dankbar.
Nach 2 Stunden grübbeln, ist das mein Ergebnis
f( int n, double x[], double y[] )
m= (n-1)*8
m>0 return = m *x*m*y
m=0 return = x*y
ist es Richtig? Und wofür ist std %f4, [%fp-8 ] da?
————————————————————————
.global psum
.section ".rodata"
.null: .word 0, 0
.section ".text"
! double psum( int n, double x[], double y[] )
! %i0 -> n
! %i1 -> x[]
! %i2 -> y[]
psum:
save %sp, -120, %sp
sethi %hi(.null), %o0
ldd [%o0 + %lo( .null )], %f4 // f4 word 32bit
st %f4, [%fp-16]
st %f4, [%fp-12]
mov %g0, %i5 // i5 =0
cmp %g0, %i0 // springe wenn %g0 >=%i0
bge .ende
nop
.schleife:
ld [%fp-16], %f8
ld [%fp-12], %f9
mov %i5, %o0
sll %o0, 3, %o1 //%o1= 8*%o0
add %i1, %o1, %g1
ld [%g1], %f4
ld [%g1+4], %f5 //%i1 nach %f4 und %f5 laden
add %i2, %o1, %g1 //%i2 nach %f6 und %f7 laden
ld [%g1], %f6
ld [%g1+4], %f7
fmuld %f4, %f6, %f4 //%f4 = %i1 *%i2
faddd %f8, %f4, %f4
st %f4, [%fp-16]
st %f5, [%fp-12]
add %i5, 1, %i5
cmp %i5, %i0 // solange %i5 <%i0 schleife
bl .schleife
nop
.ende:
ldd [%fp-16], %f4
std %f4, [%fp-8] <—–????? Wofür ??????
fmovs %f4, %f0
fmovs %f5, %f1 // Rückgabe %f0 %f1
jmp %i7+8
restore