Ad

Const Variables In Local And Global Scope In Assembly

- 1 answer

I've compiled the following C code in Compiler Exporer to see how it handles the const keyword:

int a=1;
const b=2;
int func () {
    int c=3;
    const int d=4;
}

        .section        .data
a:
        .long   1
        .section        .rodata
b:
        .long   2
func:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $3, -4(%rbp)
        movl    $4, -8(%rbp)
        nop     # also, why does it add a nop here?
        popq    %rbp
        ret

From what I can tell, for a variable defined outside a function (global to the file), it adds a label at the top. However, if it is a const variable, then the variable at the top is placed in the read-only section. My question then is for the following local variable:

const int d=4;

How is its 'constant-ness' managed, as it's just a value on the stack, and can't any value on the stack be freely modified? Or, in assembly, is there no such thing as a constant local-variable, and this is just a compiler-enforced concept?

Ad

Answer

If you don't take the address, you don't need to keep a const local in data memory anywhere. The asm equivalent is NASM d equ 4 or GAS d = 4 so you can just use it as an immediate when you do need it.

Same as a non-const int that happens not be modified: Yes, constness for locals is purely a compile-time thing that the compiler enforces to help you catch bugs.

Ad
source: stackoverflow.com
Ad