加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何修改C指针?

发布时间:2020-12-16 03:23:11 所属栏目:百科 来源:网络整理
导读:在现代处理器中,可以从存储器加载寄存器,然后将索引指针修改为所需的值.例如,在我们的嵌入式处理器中,这将通过以下方式完成: ldr r0,[r1],+12 这意味着 – 将r1指向的值加载到r0中,然后将r1增加12: r0 = [r1]r1 = r1 + 12 在C语言中,使用指针算术,可以使用
在现代处理器中,可以从存储器加载寄存器,然后将索引指针修改为所需的值.例如,在我们的嵌入式处理器中,这将通过以下方式完成:
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;

增加[0] w / o修改指针的值,并且:

i = *(p+=2);

预修改指针,所以在这种情况下我== 30.

解决方法

>是的,这是可能的.
>你不应该做奇怪的指针数学,使它发生.
>不仅仅是关于优化设置,您的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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读