FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Technische Informatik

Assembleraufgaben 08/09

Assembleraufgaben 08/09 2009-04-02 13:07
Anonymer User
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

RE: Assembleraufgaben 08/09 2009-04-02 13:45
T
   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.

RE: Assembleraufgaben 08/09 2009-04-02 14:47
Anonymer User
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.

RE: Assembleraufgaben 08/09 2009-04-02 16:14
Anonymer User
  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