【问题标题】:Assembly language st and ld汇编语言 st 和 ld
【发布时间】:2013-01-30 01:32:53
【问题描述】:

我已经将一个 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 ......)。您是如何“将 C 转换为汇编”的?你希望借此赢得什么?
  • 看起来像 SPARC,所以添加了sparc 标签。
  • 抱歉,SPARC 忘记添加了。谢谢。
  • 它们是加载和存储的。 SPARC 没有 mov 指令,尽管一些汇编程序支持它作为伪指令
  • 看起来像是源自 commodore64 的火花

标签: assembly memory sparc risc


【解决方案1】:

Sparc 具有与 x86 不同的加载存储架构,但与大多数 RISC cpu 架构(如 PPC、MIPS 和 ARM)相似。

ldst 是唯一真正的(如在硬件中实现的)指令,它们将数据移入和移出主存储器。它们还用于访问将自身呈现为内存接口的硬件。

它们的语法是

ld register_name , memory_location 的语法与st 相同。

请记住,您只能在内存中的值上使用 ld 和 st ...其余的都适用于寄存器文件。如果你还没有加载它,它就不能使用,如果你从来没有存储它,它就不会在内存中(好吧,直到你在寄存器文件中覆盖它,它仍然在那里)。

如果您需要有关 Sparc ASM 的书籍,请参阅“计算机组织和设计基础”,您可以在 google 书籍中查看其中的部分内容。另请注意,x86 (CISC) asm 与 RISC-like asm 非常不同。也就是说,与您相关的内容取决于您是否更喜欢纯软件人员 Sparc 很好(它将类似于许多类型的编译器中间表示),但如果您对微调高性能应用程序感兴趣,您可能更愿意学习 x86 asm .

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多