2010-05-27 4 views
2

Je travaille actuellement avec un peu de code d'assembleur pour la famille de processeur Sparc, et j'ai quelques problèmes avec un morceau de code. Je pense que le code et la sortie explique plus, mais en bref, c'est mon problème:L'appel d'assemblage de Sparc corrompt des données

Lorsque je fais un appel à la fonction println() les variables que j'ai écrit à l'emplacement de mémoire %fp - 8 sont détruites. Voici le code assembleur que je suis en train de courir:

!PROCEDURE main 
    .section ".text" 
    .global main 
    .align 4 
    main: 
    save %sp, -96, %sp 

L1: 
    set 96, %l0 
    mov %l0, %o0 
    call initObject ; nop 
    mov %o0, %l0 
    mov %l0, %o0 
    call Test$go ; nop 
    mov %o0, %l0 
    mov %l0, %o0 
    call println ; nop 
L0: 
    ret 
    restore 
!END main 

!PROCEDURE Test$go 
    .section ".text" 
    .global Test$go 
    .align 4 
Test$go: 
    save %sp, -96, %sp 

L3: 
    mov %i0, %l0 
    set 0, %l0 
    set -8, %l1 
    add %fp,%l1, %l1 
    st %l0, [%l1] 
    set 1, %l0 
    mov %l0, %o0 
    call println ; nop 
    set -8, %l0 
    add %fp,%l0, %l0 
    ld [%l0], %l0 
    mov %l0, %o0 
    call println ; nop 
    set 1, %l0 
    mov %l0, %i0 
L2: 
    ret 
    restore 

!END Test$go 

Voici le code assembleur pour le code println

.global println 
    .type println,#function 
println: 
    save %sp,-96,%sp 

    ! block 1 
    .L193: 

    ! File runtime.c: 
    ! 42 } 
    ! 43 
    ! 45 /** 
    ! 46 Prints an integer to the standard output stream. 
    ! 47 
    ! 48 @param i The integer to be printed. 
    ! 49 */ 
    ! 50 void println(int i) { 
    ! 51  printf("%d\n", i); 

    sethi %hi(.L195),%o0 
    or %o0,%lo(.L195),%o0 
    call printf 
    mov %i0,%o1 
    jmp %i7+8 
    restore 

Ceci est l'out mis je reçois quand je lance ce morceau de code assembleur

1 

67584 

1 

Comme u peut le voir, les données qui se trouve à %fp - 8 a été détruite. S'il vous plaît, tous les commentaires sont valables.

Répondre

2

Depuis l'appel println est certainement pas un NOP, ceci est un commentaire étrange:

call println ; nop 
set -8, %l0 
add %fp, %l0, %l0 

Je ne suis pas expert en assemblée Sparc mais en regardant ce que je me demandais si call/jmp ont ce qu'on appelle « retard slots ", donc l'instruction suivant la branche est exécutée avant que la branche prenne effet. Et ils le font:

http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/delaybra.html

Alors avez-vous commenter les opérations NOP qui étaient en fait un but, parce qu'ils essayaient de remplir la fente de retard?

call println 
nop 
set -8, %l0 
add %fp, %l0, %l0 
+0

Thx pour l'astuce, je l'ai essayé, mais je reçois toujours la même erreur .. j'ai travaillé que% fp - 4 est ok, mais tout ce qui est après est détruit .. – Sigge

1

je remarquai que j'avais forgoten à incease la taille de la sauver de 96 à 104, et cela a fonctionné comme un charme:

save %sp, -104, %sp 

au lieu de 96 dans la fonction go ..

Questions connexes