如何在GCC中通过内联汇编incl指令直接操作C变量(不通过寄存器)
如何让GCC内联汇编直接生成内存操作的
incl指令 问题背景
我编写了如下C代码:
#include <stdio.h> volatile int global_counter = 0; void increment_counter() { for (int i = 0; i < 100000; ++i) { //global_counter++; asm ("incl %0" :"+a"(global_counter) ); } } int main() { increment_counter(); printf("Final value of global_counter: %d\n", global_counter); return 0; }
使用GCC的-S -O2选项编译后,生成的核心汇编逻辑是:
movl _global_counter(%rip), %eax incl %eax movl %eax, _global_counter(%rip)
我希望直接生成如下汇编指令,去掉多余的movl寄存器中转:
incl _global_counter(%rip)
请问该如何实现?能否让GCC内联汇编直接用incl操作内存,不借助eax寄存器?
解决方案
修改内联汇编的操作数约束
你当前使用的"+a"约束强制GCC将global_counter加载到eax寄存器中操作,这就是出现movl中转的原因。要直接操作内存,需要使用内存约束"m",并调整内联汇编格式:asm ("incl %0" : : "m"(global_counter));"m"约束会告诉GCC:操作数是一个内存位置,直接对该内存执行指令即可,不需要通过寄存器中转。验证编译结果
用-S -O2重新编译修改后的代码,生成的_increment_counter函数核心逻辑会变成:movl $100000, %edx
L2:
incl _global_counter(%rip)
subl $1, %edx
jne L2
完全符合直接内存操作的`incl`指令需求。 - **补充说明** 由于`global_counter`已经被声明为`volatile`,GCC不会优化掉对它的内存访问,这确保了内联汇编中的`incl`指令会直接作用于内存中的变量,不会被编译器优化成寄存器操作。 内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

