来自C的NASM X86_64全局变量

时间:2015-11-03 11:04:45

标签: 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

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

你需要把这行

extern toto

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