我目前正在使用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
的数据已被破坏。请,所有反馈都是恭维的。
答案 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函数..