【问题标题】:Initializing Negative Data Types in ARM Assembly在 ARM 汇编中初始化负数据类型
【发布时间】:2019-11-09 23:05:11
【问题描述】:

我目前正在努力研究如何通过树莓派在 ARM 程序集中设置负数/有符号数据类型。我不是指加载和存储有符号整数,而是如何在“.data”中声明一个有符号半字。编译后,我会收到以下消息:

Error: unknown pseudo-op: '.shalfword'
file: third.s
.section .data
a:.shalfword -2

【问题讨论】:

  • 如果您使用的是 GNU Assembler(您没有提及),请研究此 Pseudo-Ops。在高级语言意义上,汇编语言中没有“变量”。无论如何,从外观上看,您要声明的是一个常量,而不是变量。
  • 使用 gcc 并查看它在文件中为 short a = -2; 发出的内容(即作为全局变量)。 .something 绝对不会在名称中签名或未签名,只是宽度。
  • @artlessnoise:在这种特定情况下,我们需要一个全局(静态存储)的初始化程序,而不是返回值。再次阅读我的评论:我说过将short a = -2; 放在全局范围内。同意,如果您想超越这一点,还编写一个加载它的函数,这可能会得到优化。 (但是你可以让你的全局变量volatile,并且让它们不是const 可能就足够了)
  • @PeterCordes 感谢您的编辑。发表评论后不久,我意识到了全球/本地的差异。我认为编译器不会尝试“可读”,并且有“结构化汇编程序”伪操作可以让程序更容易理解。然而,我最终得到了一个与我在没有编译器的情况下创建的原始示例非常接近的godbolt示例。

标签: assembly arm


【解决方案1】:

使用 gnu 汇编器,以下应该可以工作。

    .text
    start:
        adr   r3,target   ; target address to r3
        ldrsh r0,[r3],#2  ; ldrsh will sign extend
        ldrsh r1,[r3]     ; .. and post increment to get the next.
        add   r0,r0,r1    ; r0 = -2 + -3
        bx    lr
    target:
       .short -2, -3

这是godbolt example of compiler output。重要的一点是 ARM 不处理寄存器中的 8 位或 16 位(如 x86 中的 ah、al 或 ax),并且始终使用 32 位常量。所以立即加载小的负常数就像mvn rX,Y

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多