Ubuntu16.04 32位NASM汇编代码字符串长度计算异常求助
问题根因及修复方案
核心错误:未给长度变量分配内存
你在.bss段对长度变量的定义存在致命错误:
len_a resb 0 len_b resb 0
resb 0的语义是预留0字节内存,相当于没有给len_a、len_b分配任何存储空间,两个变量的地址和后续定义的num_a完全重合。你对len_a的写入操作会直接覆盖后续其他变量的内存,同时其他变量的操作也会篡改len_a的取值,这就是你计数逻辑执行次数正确,但最终长度值异常的根本原因。
修复方式:给每个长度变量分配1字节存储空间:
len_a resb 1 len_b resb 1
其他需要修复的逻辑错误
- 系统调用参数错误:3号
sys_read调用的ebx参数需要设为0(标准输入stdin的文件描述符),你当前设为2是标准错误流,无法正常读取用户输入。 - 输入结尾判断错误:
sys_read读取的输入不会自动补\0,输入内容的结尾是换行符\n(ASCII 0x0A),你当前判断cmp byte[input+edx],0无法正确识别输入结束,会导致内存越界遍历。建议改为判断是否等于换行符,或者使用sys_read的返回值(存放在eax中)确定输入总长度。 - 输出逻辑错误:你的
output函数每次固定输出10字节print_test缓冲区,你每次仅修改了缓冲区第一个字节,剩余9字节都是未初始化的垃圾值,会导致输出结果混杂无效字符。建议根据实际要输出的内容长度设置edx参数。
最小修复验证
将.bss段的len_a、len_b定义修改为resb 1后,重新编译运行即可看到长度计数符合预期。
内容的提问来源于stack exchange,提问作者Fisherman_Zhu
相关产品推荐
相关产品推荐

