c - 来自 C 的 NASM X86_64 全局变量

标签 c assembly nasm

我对 X86_64 上的 NASM 程序集完全陌生。我想在 asm 程序中访问我的变量 toto 并增加其值。到目前为止,我正在执行以下操作:

C程序:

#include <stdio.h>
#include <inttypes.h>

int64_t toto;
extern void modifytoto(void);

int main() {
    toto=0;
    modifytoto();
    printf("toto = %d \n",toto);
    return 0;
}

汇编程序如下(增量为伪代码)。
global  modifytoto
global  toto

section .text
        modifytoto:
            mov rax, 1
            mov toto, rax
            ret  

我不能使用 toto 作为 modifytoto() 的参数,因为它应该用于更复杂的程序中,我不想在其中修改参数。

我正在使用以下 cmd 进行组装
nasm -f elf64 -o mix_asm.o kernel3.asm

我收到这条消息:
kernel3.asm:7: error: symbol `toto' undefined

我的代码有什么问题?

最佳答案

你需要把线

extern toto

在使用 toto 告诉 NASM toto 是外部符号之前的某个地方。这就像在 C 中:如果你不通过声明 toto 来告诉它,编译器不知道 toto 应该是什么。

关于c - 来自 C 的 NASM X86_64 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33497534/

相关文章:

c - 在十六进制数中设置一个位

c - 替代 C 中的函数重载?

c 内联汇编字符数组转短

c - MPLAB 无法合并 .s 和 .c 文件

c++ - 如何将 C++ 子例程链接到 x86 汇编程序?

c++ - 如何在C语言中检测环绕计数器和大负值之间的区别

c# - 打开远程计算机上的文件

windows - NASM 程序集 - 这个变量后面的 ", 0"是做什么用的?

linux - 使用 x86 程序集 (GNU/Linux) 读取和打印用户输入

Windows 强制执行 READ-ONLY .text 部分,即使被 ld 链接器禁用