如何修改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优化通过,通过落入此类别并组合它们的指令对.该通行证的来源是here,并且对GCC将会做什么以及如何做到这一点有相当清晰的描述. 但是,最终,这不是您作为GCC用户的控制.开发人员掌握了您的GCC后端.所有你应该做的,就像最受欢迎的评论说的是: a = *ptr; ptr += SOME_CONST; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |