【发布时间】:2020-09-11 06:23:51
【问题描述】:
我想在汇编函数中引用一个 c 指针。在 C 中声明如下:
const uint32_t *SERCOM0_SPI_DATA_REG_ADDR = (volatile uint32_t *) &(SERCOM0->SPI.DATA.reg); // uint32_t reg;
在汇编中,指针地址(0x40003028)在调试器中正确显示。使用以下代码,我想将值 0x1f 写入 uint32_t 的 spi 寄存器。
// 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]
汇编文件是这样的:
.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
【问题讨论】:
标签: assembly arm gnu-assembler