以下是我的代码。 请注意,我没有在普通计算机上运行此代码,而是在体系结构模拟器(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;
如何让编译器生成此代码? 任何指针都会有所帮助。
答案 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架构,则可以在源文件中将该指令包含在内联汇编中。