代码之家  ›  专栏  ›  技术社区  ›  Ilya Loskutov

无法将单词加载到寄存器中

  •  1
  • Ilya Loskutov  · 技术社区  · 2 年前

    作为汇编语言的新手,我在这个类似hello world的程序上犯了一个错误:

    .global _start
    _start:
        ldr R0, =val
        mov R7, #1
        svc 0
    .data
        val: .word 0xffffffff
    

    我的目的只是加载 val 文字输入 R0 ff_16 = 255 ,我从bash得到这样一个输出:

    $ ./prog; echo $?
    132
    

    00000000 <_start>:
       0:   e59f0004        ldr     r0, [pc, #4]    ; c <_start+0xc>
       4:   e3a07001        mov     r7, #1
       8:   ef000000        svc     0x00000000
       c:   00000000        .word   0x00000000
    

    它显示了从 PC 4 但是这个词标记为 4: 84_16 = 132 价值,那么它来自哪里?

    请澄清一下。

    架构:arm7l,操作系统:raspberrypi 5.4.72-v7+

    1 回复  |  直到 2 年前
        1
  •  1
  •   fuz    2 年前

    说明

            ldr r0, =val
    

    val 进入 R0 . 它组装成类似

            ldr r0, foo
            ...
    foo:    .int val
    

    加载的值 ,您需要

            ldr r0, val
    

    增值税 相当接近(例如,小于约±1 kB)。如果 如果距离较远或在另一段中(如您的情况),则需要首先加载地址,然后加载数据:

            ldr r0, =val
            ldr r0, [r0]
    

    还请注意,您可能需要使用 movw movt ldr r0, =... 指令(如果支持)(ARMv7有);在受支持的地方速度稍快,因为它消除了负载:

            movw r0, :lower16:val
            movt r0, :upper16:val
    

    这两条指令可以与其他指令一起发出,但如果连续发出,它们会在一些内核上进行宏融合,从而提高性能,因此请尝试这样做。你也可以单独使用 movw公司