Вызов сборки Sparc искажает данные

В данный момент я работаю с кодом на ассемблере для семейства процессоров Sparc, и у меня возникли проблемы с фрагментом кода. Я думаю, что код и вывод объясняют больше, но вкратце это моя проблема:

Когда я вызываю функцию println(), переменные, которые я записал в ячейку памяти %fp - 8, уничтожаются. Вот код ассемблера, который я пытаюсь запустить:

    !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

Вот код ассемблера для кода 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

Это результат, который я получаю, когда запускаю этот фрагмент кода на ассемблере.

1

67584

1

Как видите, данные, расположенные по адресу %fp - 8, были уничтожены. Пожалуйста, все отзывы приветствуются.


person Sigge    schedule 27.05.2010    source источник


Ответы (2)


Поскольку вызов println точно не является NOP, это странный комментарий:

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

Я не эксперт в сборке Sparc, но, глядя на это, я задался вопросом, есть ли у call/jmp так называемые «слоты задержки», поэтому инструкция, следующая за ветвью, выполняется до того, как ветвь вступит в силу. И они делают:

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

Итак, вы закомментировали операции NOP, которые на самом деле были целенаправленными, потому что они пытались заполнить слот задержки?

call println
nop
set -8, %l0
add %fp, %l0, %l0
person HostileFork says dont trust SE    schedule 27.05.2010
comment
Спасибо за подсказку, я попробовал, но все равно получаю ту же ошибку.. я понял, что %fp - 4 в порядке, но все после этого уничтожается.. - person Sigge; 27.05.2010

Я заметил, что забыл увеличить размер сохранения с 96 до 104, и тогда все заработало как по маслу:

save %sp, -104, %sp

Вместо 96 в функции go..

person Sigge    schedule 27.05.2010