是否可以从C访问程序集中定义的变量?

oru*_*tam 5 c variables assembly gcc mingw

我可以读取或写入我的C文件中的程序集文件中定义的变量吗?我无法自己解决这个问题.例如,C文件如下所示:

int num = 33;
Run Code Online (Sandbox Code Playgroud)

并生成此汇编代码:

    .file   "test.c"
    .globl  _num
    .data
    .align 4
_num:
    .long   33
Run Code Online (Sandbox Code Playgroud)

当我开始学习装配时,我经常听到速度是我必须选择装配和降低文件大小和所有东西的原因......

我在Windows 7上使用mingw(32位)gnu程序集

the*_*rld 7

是的,Linker组合了所有.o文件(从.s文件构建)并生成单个目标文件.因此,所有c文件将首先成为汇编文件.

每个程序集文件都有一个导入列表和一个导出列表.导出列表包含具有.global.globl指令的所有变量.导入列表包含以c文件中的extern开头的所有变量.(与NASM不同,GAS不需要声明导入.文件中未定义的所有符号都假定为外部.但结果.o.obj目标文件将包含他们使用的符号的导入列表,并且需要在其他地方定义.)

因此,如果您的程序集文件包含:

    .globl  _num        # _num is a global symbol, when it is defined
    .data               # switch to read-write data section
    .align 4
_num:                   # declare the label 
    .long  33           # 4 bytes of initialized storage after the label
Run Code Online (Sandbox Code Playgroud)

为了使用num,你需要做的就是创建一个这样的extern变量

extern int num;  // declare the num variable as extern in your C code   
Run Code Online (Sandbox Code Playgroud)

然后你就可以阅读或修改它了.


许多平台(Windows,OS X)在符号名称中添加了前导下划线,因此C变量num的asm名称为_num.Linux/ELF不这样做,因此asm名称也是如此num.