1

我已将 ac 程序转换为汇编程序,并试图简化代码:

.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 或其他方法是否有其他方法可以做到这一点?很难在网上找到这类事情的资源,因此我们将不胜感激。

4

1 回答 1

2

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 .

于 2013-01-31T14:23:36.127 回答