C文件定义的CountDown变量在汇编文件中未定义问题求助
解决汇编文件引用C全局变量的未定义符号错误
问题原因
你的汇编文件中没有显式声明CountDown是外部符号,NASM在汇编阶段无法识别这个变量是在C文件中定义的,因此抛出未定义符号错误。
修复步骤
在汇编文件中添加外部符号声明
在汇编文件的开头,和extern keyboard_handler并列,添加extern CountDown,告诉NASM这个变量在其他目标文件(C编译生成的kc.o)中定义:... extern keyboard_handler extern CountDown ; 新增该行,声明外部变量 TimerIRQ: push eax mov eax, [CountDown] test eax, eax jz TimerDone dec eax mov [CountDown], eax TimerDone: pop eax iretd ...修正C文件中的变量定义
你之前尝试过extern volatile unsigned int CountDown = 2;,这是错误的写法:extern是变量声明(仅告诉编译器变量存在),不能同时初始化。正确的全局变量定义应该去掉extern:... #include "include/time.h" volatile unsigned int CountDown = 2; // 正确的定义方式,不带extern void keyboard_handler() ...
原理说明
C编译器会将全局变量编译为全局导出符号,但汇编器默认只处理当前文件内的符号。通过extern声明,你告诉NASM:这个符号不在当前汇编文件中,链接阶段会从其他目标文件(比如kc.o)中查找并关联。
重新执行你的编译命令,就能正常通过汇编和链接环节了。
内容的提问来源于stack exchange,提问作者i cant think of a name
相关产品推荐
相关产品推荐

