如何在不使用指针的情况下直接访问内存地址?

时间:2017-10-31 23:01:51

标签: c pointers

以下是我的代码。 请注意,我没有在普通计算机上运行此代码,而是在体系结构模拟器(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;

如何让编译器生成此代码? 任何指针都会有所帮助。

2 个答案:

答案 0 :(得分:1)

我不知道你是否可以在没有指针的情况下完成它,但是如果你不想在一个单独的行上声明一个指针,你可以这样做:

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

答案 1 :(得分:0)

如果您关心额外的周期,可以使用一些内联汇编。通常,MOV指令(MOV r / m32,imm32)允许您将立即值移入寄存器或寄存器指向的地址。如果您希望完全绕过寄存器的使用,可以使用C6指令(from this post)。

  c6        04         25      0xffff     3
  opcode    modr/m     sib     address    immediate

假设您使用的是x86架构,则可以在源文件中将该指令包含在内联汇编中。