2

私は現在、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破壊されています。お願いします、すべてのフィードバックは aprecated です。

4

2 に答える 2

2

呼び出しprintlnは確かに NOP ではないため、これは奇妙なコメントです。

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

私はSparcアセンブリの専門家ではありませんが、これを見て、「遅延スロット」と呼ばれるものがあるのではないかと思っcalljmpので、分岐に続く命令は分岐が有効になる前に実行されます。そして彼らは:

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

では、遅延スロットを埋めようとしていたため、実際には意図的な NOP 操作をコメントアウトしましたか?

call println
nop
set -8, %l0
add %fp, %l0, %l0
于 2010-05-27T17:00:20.977 に答える
1

保存のサイズを 96 から 104 に増やすのを忘れていたことに気付きました。

save %sp, -104, %sp

go 関数の 96 の代わりに..

于 2010-05-27T17:36:14.270 に答える