在现代处理器中,可以从存储器加载寄存器,然后将索引指针修改为所需的值.例如,在我们的嵌入式处理器中,这将通过以下方式完成:
ldr r0,[r1],+12
这意味着 – 将r1指向的值加载到r0中,然后将r1增加12:
r0 = [r1] r1 = r1 + 12
在C语言中,使用指针算术,可以使用指针分配值,然后将指针提前1:
char i,*p,a[3]={10,20,30}; p = &(a[0]); i = *p++; // now i==10 and p==&(a[1]).
我正在寻找一种方法来取消引用指针,同时将其修改为除1以外的偏移量.这可能在C中,因此它很好地映射到类似的asm指令?
注意:
i = *p+=2;
i = *(p+=2);
预修改指针,所以在这种情况下我== 30.
解决方法
>是的,这是可能的.
>你不应该做奇怪的指针数学,使它发生.
>不仅仅是关于优化设置,您的GCC后端需要告诉GCC它具有这样的功能(即当GCC本身被编译时).基于此知识,GCC自动将相关序列组合成单个指令.
>你不应该做奇怪的指针数学,使它发生.
>不仅仅是关于优化设置,您的GCC后端需要告诉GCC它具有这样的功能(即当GCC本身被编译时).基于此知识,GCC自动将相关序列组合成单个指令.
即如果你的后端是正确的,甚至像:
a = *ptr; ptr += SOME_CONST;
应该成为一个单一的修改后的指令.
编写后端时如何正确设置? (请问您的友好邻里GCC后端开发人员为您做)
如果您的GCC后端被称为foo:
>在GCC源代码树中,后端描述和钩子将位于gcc / config / foo /.
>在其中的文件(与GCC一起编译)中,通常有一个头foo.h,其中包含很多描述机器特性的#define.
> GCC希望支持后期增量的后端定义宏HAVE_POST_INCREMENT来评估为true,如果支持修改后,则将宏HAVE_POST_MODIFY_DISP定义为true. (post-increment => ptr,post-modify => ptr = CONST).也许还有一些其他的事情要处理.
假设你的处理器的后端有这个权利,那么我们可以转到当你编译包含修改后的序列的代码时会发生什么:
有一个特定的GCC优化通过,通过落入此类别并组合它们的指令对.该通行证的来源是here,并且对GCC将会做什么以及如何做到这一点有相当清晰的描述.
但是,最终,这不是您作为GCC用户的控制.开发人员掌握了您的GCC后端.所有你应该做的,就像最受欢迎的评论说的是:
a = *ptr; ptr += SOME_CONST;