NASM X86_64来自C的全局变量
我对X86_64上的NASM程序集一无所知。我想在asm程序中访问变量toto并增加其值。到目前为止,我正在做以下工作: C程序:NASM X86_64来自C的全局变量,c,assembly,nasm,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); retur
#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;
}
我不能使用toto作为modifytoto()的参数,因为这应该在更复杂的程序中使用,我不想修改参数
我正在装配以下命令
nasm -f elf64 -o mix_asm.o kernel3.asm
我得到的信息是:
kernel3.asm:7: error: symbol `toto' undefined
我的代码有什么问题吗?你需要把这行
extern toto
在使用
toto
告诉NASMtoto
是一个外部符号之前的某个地方。这就像在C中一样:如果你不通过声明toto
来告诉它,编译器不知道toto应该是什么,为什么你认为'mov toto,rax'会增加toto的值?mov覆盖toto值,其值变为1,但不再是1。尝试添加toto,1Cool,asm说明只是为了表明我的目的,但你是对的。谢谢为什么AddToto,1给我这个消息?操作码和密码的组合无效operands@syf编写添加DWORD PTR toto,1
,然后阅读手册,然后再回来询问更多问题。非常感谢!最后,我写了mov-rax,1 add[toto],rax,还可以
extern toto