我有以下代码
#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;
}
但是,带有
-S -O2
选项的 gcc 会编译为以下汇编代码
_increment_counter:
LFB1:
movl $100000, %edx
.p2align 4,,10
.p2align 3
L2:
movl _global_counter(%rip), %eax
# 8 "x_test.c" 1
incl %eax
# 0 "" 2
subl $1, %edx
movl %eax, _global_counter(%rip)
jne L2
ret
这意味着汇编代码被编译为:
movl _global_counter(%rip), %eax
incl %eax
movl %eax, _global_counter(%rip)
我怎样才能让它编译为
incl _global_counter(%rip)
直接不用
movl
指令?
是否可以让gcc内联汇编直接在内存上使用
incl
指令,而不使用寄存器eax
?
你需要告诉编译器你的意图是什么:
void increment_counter()
{
for (int i = 0; i < 100000; ++i)
{
asm volatile (
"lock incl %0" // Use `lock` for atomic increment if multithreaded
: "=m" (global_counter) // Directly modify memory
: "m" (global_counter) // Specify memory operand
);
}
}