我想在汇编函数中引用一个c指针。在C中,声明如下:
const uint32_t*SERCOM0_SPI_DATA_REG_ADDR=(volatile uint32.t*(&(SERCOM0->SPI.DATA.reg(;//uint32_t注册;
在assem中,指针地址(0x40003028(正确显示在调试器中。使用以下代码,我想将值0x1f写入spi寄存器,该寄存器为uint32_t。
// reg uint32_t sercom spi data
ldr r0, =SERCOM0_SPI_DATA_REG_ADDR
ldrb r1,=#0x1f
str r1, [r0]
如果我现在查看寄存器r0,则值不是0x40003028,而是0x20000F8C。因此,在地址处写入的不是值0x1f。
在拆卸窗口中:
44: ldr r0, =SERCOM0_SPI_DATA_REG_ADDR
00007804 ldr r0, [pc, #28]
45: ldrb r1,= #0x1f // SERCOM0_SPI_DATA_SYNC_DATA
00007806 mov.w r1, #31
46: str r1, [r0]
assem文件如下:
.section .ram
.syntax unified
.cpu cortex-m4
.thumb
.space 0xe4
.data
.text
.align 4
.type SEND_DATA, %function
.global SEND_DATA
VUSB_SEND_DATA:
...
bx lr
回想一下,汇编中的符号是它们所代表的变量的地址。所以
ldr r0, =SERCOM0_SPI_DATA_REG_ADDR
用SERCOM0_SPI_DATA_REG_ADDR
的地址加载r0
,大致等于
r0 = &SERCOM0_SPI_DATA_REG_ADDR;
要加载该变量的值,您需要取消引用刚刚获得的指针:
ldr r0, =SERCOM0_SPI_DATA_REG_ADDR @ load address of variable
ldr r0, [r0] @ load value of variable
将此与您剩余的代码结合起来,这应该可以解决您的问题。请注意,为了获得更好的代码大小,我建议在thumb目标上加载小常量时显式使用movs
。
ldr r0, =SERCOM0_SPI_DATA_REG_ADDR
ldr r0, [r0]
movs r1, #0x1f
str r1, [r0]
这应该会产生所需的结果。