如果有一种简单的方法来完成你想要的东西,这将是很好的,但事实是这样做需要一些你正在进行的环境和编译器的环境知识。也是答案不是唯一的情况。我们在谈论什么样的汇编者,我们在谈论哪个C编译器?我需要开始计时器,这个装配代码正常工作,但需要转换为C.任何援助非常感谢,
// #define t_base 0xff202000
// volatile int * t_ptr =(int *)t_base;
@获取地址
LDR R4,= 0xFF202000
以下需要援助....
@启动持续计时器
@ counting(0b0110)
Mov r1, #6
STR r1, [r4, #4]
*(t_ptr + 4)= 6;
*(++ t_ptr)= 6;
感谢您的解释并尝试启动时钟ARMv7系统模拟器(01xz.net)当我单击按钮0时模拟器。如果有一种简单的方法来完成你想要的东西,这将是很好的,但事实是这样做需要一些你正在进行的环境和编译器的环境知识。也是答案不是唯一的情况。我们在谈论什么样的汇编者,我们在谈论哪个C编译器?
在上面的第一个例子中,你已经给了自己想要的东西。我不知道你觉得你错过了什么。您已经取了一个十六进制常量(我认为它代表某个处理器内存空间中的绝对地址),对该常量进行了强制转换,创建了一个指向整型数的指针,并将其赋值给一个名为T_ptr的变量。您还指出T_ptr是易失性的,这意味着编译器不能依赖于能够读回它刚刚写入到T-ptr的内容。
我猜这两个汇编语言指令是什么意思,但如果我们可以依靠T-ptr分配给它的值,也就是说,一个指针地址0 xff202000,你要做的是写什么地址+ 4价值“6”,然后下面的“可以理解”,你的编译器:
应该这样做。这不是肯定的,不是某些,但可能是。如果您知道指向INT的指针的大小完全是4,那么您也可以写C:*(t_ptr + 4)= 6;
在T_PTR上使用++(预增量)运算符。C:*(++ t_ptr)= 6;
都清楚了吗?