我已将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或其他东西,有不同的方法吗?很难在网上找到这类资源的资源,所以我们将不胜感激。
答案 0 :(得分:1)
Sparc有一个加载存储架构,与x86不同,类似于大多数RISC cpu架构,如PPC,MIPS和ARM。
ld和st是唯一真实的(如在硬件中实现的)指令,用于将数据移入和移出主存储器。它们还用于访问将其自身表示为内存接口的硬件。
的语法是
ld register_name,memory_location与st。
的语法相同记住你只能在内存中使用ld和st值......其余所有内容都适用于寄存器文件。如果你还没有加载它它是不可用的,如果你没有存储它,它将不会在内存中(直到你仍然在寄存器文件中覆盖它仍然存在)。
如果您需要有关Sparc ASM的书籍,请参阅“计算机组织与设计基础”,您可以在Google图书上查看部分内容。另请注意,x86(CISC)asm与RISC类似的asm非常不同。那说哪个与你相关取决于你是否更像纯软件人Sparc很好(它类似于许多类型的编译器中间表示)但如果你对微调高性能应用程序感兴趣,你可能更愿意学习x86 asm