Assembly 未定义对地址的引用,即使在提到的行中没有对地址的引用

Assembly 未定义对地址的引用,即使在提到的行中没有对地址的引用,assembly,arm,raspberry-pi3,raspbian,Assembly,Arm,Raspberry Pi3,Raspbian,我得到以下错误: build/main.o:source/main.s:91: undefined reference to `addr_r' collect2: error: ld returned 1 exit status 根据该代码: 82] @ Register Aliases for subroutines 83] addr_r .req r4 84] 85] write_latch: 86] mov fp, sp @ save p

我得到以下错误:

build/main.o:source/main.s:91: undefined reference to `addr_r'
collect2: error: ld returned 1 exit status
根据该代码:

82] @ Register Aliases for subroutines
83] addr_r  .req    r4
84]
85] write_latch:
86]     mov     fp, sp              @ save position in calling code
87]     PUSH    {r4-r10}            @ preserve variable registers
89]         @ do stuff here later
90]     POP     {r4-r10}            @ restore variable registers
91]     bx      lr                  @ return to position in calling code

我在运行rasbian的Raspberry Pi 3上使用ARMv7。有人能解释为什么或如何修复它吗?

事实证明,问题根本不在第91行,而是在另一个子例程中的以下行:

ldr r0, =addr_r     @ address for GPFSEL{n}
我将别名寄存器作为标签引用,将其更改为:

mov r0, addr_r      @ address for GPFSEL{n}

这就解决了问题!:D

在GNU汇编程序语法中,标签后面必须跟冒号。@fuz:…req是一个GNU汇编程序ARM指令,它确实注册了别名,并且不需要冒号,正如@MichaelPetch所说的非常奇怪。感谢您的澄清。我建议您不要在寄存器中使用别名,或者至少将原始寄存器放入别名中,如addr_r4,因为您的别名使您无法看到正在使用哪个寄存器,这在查看/错误查找时很重要,要快速查看。如果没有这一点,我个人很容易将r4重新用于其他用途,因为几天后我就会忘记它已经分配给addr\r了。