Intel x86 32位汇编删除未使用.data段触发段错误问题咨询
问题成因分析
- 核心触发原因:你使用了x86汇编的*保留关键字
in*作为自定义变量名。in是x86架构下端口输入指令的助记符,属于NASM默认的保留字符,对该符号的解析会受代码整体结构(比如段的存在与否)影响。
当你保留非空的.data段时,NASM能正确将in识别为你定义在.bss段的变量符号,mov ecx, in会正确加载变量的可写地址;当你删除.data段或将其置空时,NASM的解析逻辑出现偏移,错误将in识别为指令相关的立即数,导致ecx寄存器存入的是非法内存地址,调用read系统调用时尝试往该非法地址写入数据,直接触发段错误。 - 验证方案:将代码中所有的
in替换为非保留字名称,比如input_buf,重新编译链接后,就算删除整个.data段程序也能正常运行。 - 额外优化建议:你当前
read系统调用的文件描述符参数(ebx)填的是2(对应标准错误流),正常读取用户输入应该使用0(对应标准输入流),可以避免部分受限环境下无法正常读取输入的问题。
内容的提问来源于stack exchange,提问作者tjcaul
相关产品推荐
相关产品推荐

