C 地址偏移量

标签 c assembly

所以我试图对微 Controller 上的寄存器中的一些位进行 ORR。 到目前为止,我一直在使用 Assembly,现在我使用 C,但我遇到了一些困难。

因此,在 ASM 中,如果我想访问具有偏移量的寄存器,例如: GPIO_PORT_F 和偏移 GPIO_DATA 我将使用以下代码。

LDR R0,=GPIO_PORT_F ;load the base
LDR R1, [R0, #GPIO_DATA] ;load the offset
ORR R1, 0x1 ;ORR it with a value
STR R1, [R0, #GPIO_DATA] ;store back

这正是我想要在 C 中执行的操作。 这就是我所拥有的。

GPIO_PORT_F 定义如下 #define GPIO_PORT_F (*((unsigned long *)0x40025000))

(GPIO_PORT_F+GPIO_DATA) = (GPIO_PORT_F+GPIO_DATA) | inMask;

我收到错误“表达式必须是可修改的左值”

我在这里做错了什么,我正在使用它来抵消。

最佳答案

赋值运算的左侧通常不能有另一个运算的结果。在不深入探讨左值和右值之间的差异的情况下,赋值运算符左侧的值必须是可修改的,而加法运算符的结果则不能修改(更多有关左值与右值的信息,请参阅 this question 的答案) )。我认为 PORTA+GPIO_DIR 是指针算术,所以也许是这样的:

PORTA[GPIO_DIR] = *(PORTA+GPIO_DIR)|inMask; 

PORTA[GPIO_DIR]*(PORTA+GPIO_DIR) 都产生相同的左值,即索引 GPIO_DIR 处的元素数组PORTA。我已将两者都包含在内,以便您可以决定您喜欢哪一个,但通常使用左侧。

关于C 地址偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26175295/

相关文章:

将文件转换为 C 中的二进制缓冲区?

c++ - 使用C++解析HTTP请求流: any not state machine way with same speed or better?

C:使用 extern 时对变量的 undefined reference

C:帮助理解指针

unit-testing - 哪些单元测试框架可用于 x86 汇编器?

c - 在简单的 C 程序中遇到问题

assembly - 在 Visual Studio 代码中运行 asm

java - Java strictfp 修饰符对现代 CPU 有什么影响吗?

c++ - 如何指示 VC++ 编译器不内联常量?

c++ - 有什么方法可以在运行时不间断地动态更新二进制文件(可执行文件)?