对汇编程序中的C指针的引用



我想在汇编函数中引用一个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]

这应该会产生所需的结果。

最新更新