Sparc Assembly Call破坏了数据

时间:2010-05-27 16:31:21

标签: assembly 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的数据已被破坏。请,所有反馈都是恭维的。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我注意到我忘了将保存的大小从96增加到104,然后就像魅力一样:

save %sp, -104, %sp

而不是96中的go函数..