我能否在C文件中读取或写入在我的汇编文件中定义的变量?我自己无法弄清楚。例如,C文件如下所示:
int num = 33;
并生成以下汇编代码:
.file "test.c"
.globl _num
.data
.align 4
_num:
.long 33
当我开始学习汇编语言时,经常听到速度是选择汇编语言和更小的文件大小等方面的原因...
我在Windows 7上使用mingw(32位)GNU汇编语言。
我能否在C文件中读取或写入在我的汇编文件中定义的变量?我自己无法弄清楚。例如,C文件如下所示:
int num = 33;
.file "test.c"
.globl _num
.data
.align 4
_num:
.long 33
当我开始学习汇编语言时,经常听到速度是选择汇编语言和更小的文件大小等方面的原因...
我在Windows 7上使用mingw(32位)GNU汇编语言。
.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
extern int num; // declare the num variable as extern in your C code
然后,您就可以阅读或修改它。
许多平台(如Windows和OS X)会在符号名称前添加下划线,因此C变量num
的汇编名称为_num
。而Linux/ELF不会这样做,所以汇编名称也将是num
。
.globl _num
并不声明_num
,它只意味着如果它被声明,它将是一个全局符号。这个答案错过了问题中的_num:
.long
。你永远不想在变量名中使用前导下划线的C变量;这些总是保留给标准库和其他实现的部分。在没有那种形式的名称重整的ELF平台上,你从汇编中删除_
,而不是将其添加到C中。 - Peter Cordes.global num num: .int 13
这是我的C文件:`#include <stdio.h>extern int num;int main() { printf("%d\n", num);
} 我遇到了一个链接问题:
math.c:(.text+0xf): undefined reference to 'num'` 我做错了什么? - orustammanapov_num
在正确的部分吗?难道不应该先出现.data
指令(也许还有.align
)? - Brett Hale