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

时间:2012-03-11 22:55:02

标签: c variables gcc assembly mingw

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

int num = 33;

并生成此汇编代码:

    .file   "test.c"
    .globl  _num
    .data
    .align 4
_num:
    .long   33

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

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

2 个答案:

答案 0 :(得分:6)

是的,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

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

extern int num;  // declare the num variable as extern in your C code   

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


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

答案 1 :(得分:4)

是的,您可以双向分享变量。使用.globl,然后在C中声明一个外部变量,就像它在另一个C模块中一样,而是在asm模块中。