从C语言中是否可以访问汇编定义的变量?

6

我能否在C文件中读取或写入在我的汇编文件中定义的变量?我自己无法弄清楚。例如,C文件如下所示:

int num = 33;

并生成以下汇编代码:
    .file   "test.c"
    .globl  _num
    .data
    .align 4
_num:
    .long   33

当我开始学习汇编语言时,经常听到速度是选择汇编语言和更小的文件大小等方面的原因...

我在Windows 7上使用mingw(32位)GNU汇编语言。


7
不要太防御心强。 - UmNyobe
9
当我开始学习汇编语言时,经常听到速度是选择汇编语言、降低文件大小等方面的原因...但是,能够手动优化汇编代码并比编译器更擅长此项工作的人知道何时使用何种方法。你好像还没有达到这个水平。你的编译器很可能能够输出比你更好的汇编代码(但这并不意味着你应该停止学习!)。 - Ed S.
1
正因为如此,即使它们乍一看可能很愚蠢,我仍然会提出问题。 - orustammanapov
2个回答

9
是的,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的汇编名称为_num。而Linux/ELF不会这样做,所以汇编名称也将是num


1
@Cherry:你的编辑引入了多个错误,我用另一个编辑进行了修复。其中一些错误是由于原始答案中误导性的部分造成的。例如,.globl _num并不声明_num,它只意味着如果它被声明,它将是一个全局符号。这个答案错过了问题中的_num: .long。你永远不想在变量名中使用前导下划线的C变量;这些总是保留给标准库和其他实现的部分。在没有那种形式的名称重整的ELF平台上,你从汇编中删除_,而不是将其添加到C中。 - Peter Cordes

4
是的,你可以双向共享变量。使用.globl像你之前一样,在C中声明一个外部变量,就好像它在另一个C模块中一样,但实际上它在一个asm模块中。

我已经尝试过了,但是遇到了一些链接问题,这是汇编代码:.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
你是将两个文件一起编译还是只编译你的C文件? - theRealWorld
我将它们编译如下:gcc -m32 -o test test.c myasm.s - orustammanapov
1
@orustam,在asm文件中变量名应该是_num。这里有另一个线程讨论mingw上的下划线问题。https://dev59.com/XHNA5IYBdhLWcg3wQ7Yw - Sam Liao
@orustam,你确定_num在正确的部分吗?难道不应该先出现.data指令(也许还有.align)? - Brett Hale
arsane - 谢谢!!!它起作用了,我知道函数应该有下划线,但从未听说过变量。当我反汇编我的c文件时,gcc也给我的变量加了下划线,我必须自己解决,但感谢您的帮助。 - orustammanapov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接