我可以在 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/