如何通过gcc中的内联汇编“incl”指令直接操作C变量(不通过寄存器)?

问题描述 投票:0回答:1

我有以下代码

#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

c assembly x86-64 inline-assembly
1个回答
0
投票

你需要告诉编译器你的意图是什么:

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
        );
    }
}

https://godbolt.org/z/6bvYcd3vM

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.