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

标签 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 程序集

最佳答案

是的,链接器将所有 .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 的汇编名称为 _num。 Linux/ELF 不这样做,因此 asm 名称也将是 num

关于c - 是否可以从 C 访问程序集中定义的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9659731/

相关文章:

c - 试图使连续的 FIFO 数据流

c++ - C++0x 是否支持 __stdcall 或 extern "C"capture-nothing lambdas?

c - 验证 scanf 条目

c - libnet tcp header 结果全为零

php - php 变量在文件中的顺序

php - 人们曾经使用过variable.php 文件吗?

javascript - 如何在 jQuery ajax 函数中使用 URL 变量?

c++ - 循环内是否有常量函数返回值的优化?

c - '^' 除了检查两个数字是否相等之外,C 中使用的运算符是什么?

haskell - cabal 安装 `gcc' 在阶段 `C Compiler' 失败