2015-11-03 129 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