我已经将c程序转换为汇编程序,并试图简化代码:
.global Func1
Func1: save %sp, -112, %sp
!st %i0, [%fp+68]
!st %i1, [%fp+72]
!ld [%fp+68], %o0
!ld [%fp+72], %o1
call Func2, 0
nop
mov %o0, %g1
mov %g1, %i0
ret
restore
.global Func2
Func2: save %sp, -112, %sp
!st %i0, [%fp+68]
!st %i1, [%fp+72]
!ld [%fp+68], %g2
!ld [%fp+72], %g1
add %g2, %g1, %g1
umul %g1, 2, %g1
mov %g1, %i0
ret
restore
我已经简化了它,以至于当我尝试更改某些内容时,它会更改程序的返回值。我的问题是,st 和 ld 是做什么的?我知道他们的意思,但这里到底发生了什么?有没有其他方法可以只使用 mov 或其他东西来做到这一点?很难在网上找到这种事情的资源,所以将不胜感激。
Sparc具有负载存储架构,与x86不同,类似于大多数RISC CPU架构,如PPC,MIPS和ARM。
ld
和st
是将数据移入和移出主存储器的唯一真实(如在硬件中实现)指令。它们还用于访问将自身显示为内存接口的硬件。
它们的语法是
ld register_name , memory_location
相同的语法适用于st
.
请记住,您只能在内存中的值上使用 ld 和 st...其余的都适用于寄存器文件。如果您尚未加载它,则它不可用,如果您从未存储它,它将不会在内存中(直到您在寄存器文件中覆盖它为止,它仍然存在)。
如果您需要一本关于Sparc ASM的书,请参阅此"计算机组织和设计基础",您可以在Google Books上查看其中的一部分。还要注意的是,x86(CISC)asm与类似RISC的asm非常不同。也就是说,哪个与你相关取决于你是否更像是一个纯粹的软件人 Sparc 很好(它将类似于许多类型的编译器中间表示),但如果你对微调高性能应用程序感兴趣,你可能更愿意研究 x86 asm。