2015-11-03 104 views
3

我对X86_64上的NASM程序集完全陌生。我想在一个asm程序中访问我的变量toto并增加它的值。到目前为止,我做了以下内容:NASM X86_64全局变量C

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 

我不能使用托托作为参数传递给modifytoto(),因为这是应该在一个更复杂的程序,其中我不wan't修改参数来使用。

我用下面的CMD

nasm -f elf64 -o mix_asm.o kernel3.asm 

assemblying,我得到这个消息:

kernel3.asm:7: error: symbol `toto' undefined 

什么是错我的代码?

+3

为什么你认为'mov toto,rax'会增加toto的价值? mov覆盖toto值,其值变为1,但不是一个。尝试添加托托,1 – red0ct

+0

很酷,asm说明只是为了表明我的目的,但你是对的。谢谢 ! –

+0

为什么添加toto,1给我这个信息? 操作码和操作数的无效组合 –

回答

3

你需要放线

extern toto 

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