简体   繁体   中英

Address of global variables in x86 assembly

I have a C code that declares global variable char file[MAX] . This variable is used in various functions directly to copy filename to it. I can compile this c file to assembly code but I don't know how to find the address of this variable?

In x86 stack, how do I find the address of a global variable? Can you give me an example how global variable is referenced in assembly code?


EDIT: I don't see a .Data segment in the assembly code.

To store the address of file to register EAX:

AT&T syntax: movl $_file, %eax

intel syntax: mov eax, OFFSET _file


How to examine:

Firstly, write a simple code ( test.c ).

#define MAX 256

char file[MAX];

int main(void) {
    volatile char *address = file;
    return 0;
}

Then, compile it to asssembly code: gcc -S -O0 -o test.s test.c

    .file   "test.c"
    .comm   _file, 256, 5
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
    .globl  _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    call    ___main
    movl    $_file, 12(%esp)
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE0:
    .ident  "GCC: (GNU) 4.8.1"

Or if you want intel syntax: gcc -S -O0 -masm=intel -o test_intel.s test.c

    .file   "test.c"
    .intel_syntax noprefix
    .comm   _file, 256, 5
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
    .globl  _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
LFB0:
    .cfi_startproc
    push    ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    mov ebp, esp
    .cfi_def_cfa_register 5
    and esp, -16
    sub esp, 16
    call    ___main
    mov DWORD PTR [esp+12], OFFSET FLAT:_file
    mov eax, 0
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE0:
    .ident  "GCC: (GNU) 4.8.1"

With a little more experiments and examination, I got the result.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM