下面是我的代码。
请注意,我不是在普通机器上运行此代码,而是在架构模拟器(gem5)上运行。

#include <stdio.h>
int main()
{
   int *p;
   int x;
   p = &x;
   p[0] = 3;
   // *(0xffff) = 6;
   return 0;
}

如果取消对该行的注释,则会出现编译器错误(这是预期的)“间接寻址需要指针操作数”。
因为我不是在实际的机器上运行,而是在模拟器上运行,所以我可以控制硬件的行为和地址空间。
我想将值6存储在地址0xffff中。一种方法是:
int *p;
p = (int *)0xffff;
p[0] = 6;

请注意,这不会对我造成分段错误,因为我正在模拟器上运行它,并且我控制地址空间。
但是,这是一种效率低下的方法,因为每次应该访问变量“p”,获取0xffff,然后存储6。即使被声明为寄存器,访问变量“p”也需要1个周期,从长远来看,这对我来说是昂贵的。
既然我知道“p”总是有0xffff,我就不能写些
*(0xffff) = 3;

如何允许编译器生成此代码?
任何指点都有帮助。

最佳答案

我不知道你能不能不用指针,但是如果你不想在单独的一行声明指针,你可以这样做:

*(int*)(0xffff) = 3;

10-06 15:08