汇编代码输出顺序不符预期的原因及正确实现咨询
问题分析与解决
核心问题
- 字符串无终止符:
.data段的text和text2仅定义了字符与换行,未添加0作为终止标记,导致_printstring会持续读取内存直到遇到随机0,输出包含无关数据。 - 赋值宽度错误:
mov rax, "bbb"将64位寄存器的低4字节("bbb"仅3个字符,高位补0)写入[text],一次性覆盖8字节内存,直接破坏了text2的起始内容,导致后续输出错乱。
修正后的代码
section .data text db "aaaa", 10, 0 ; 追加0作为字符串终止符 text2 db "cccc", 10, 0 section .text global _start _start: mov rax, text call _printstring ; 逐字节写入"bbb",仅修改text前3个字节,保留换行符 mov byte [text], 'b' mov byte [text+1], 'b' mov byte [text+2], 'b' mov rax, text call _printstring mov rax, text2 call _printstring mov eax, 60 xor edi, edi syscall _printstring: push rax mov rbx, 0 _printstringloop: mov cl, [rax] ; 先读取当前字节,判断是否为终止符 cmp cl, 0 je _printstringend inc rax inc rbx jmp _printstringloop _printstringend: mov rax, 1 mov rdi, 1 pop rsi mov rdx, rbx syscall ret
关键修正说明
- 添加终止符:每个字符串末尾加
0,让打印函数能准确识别结束位置,避免读取后续内存。 - 逐字节赋值:用
mov byte指令逐个写入字符,仅修改目标区域,不会破坏text2的内容。 - 修复循环逻辑:原循环先递增指针再判断,会遗漏第一个字符的检查,调整为先读取判断再递增,确保长度统计准确。
内容的提问来源于stack exchange,提问作者RudyChemik
相关产品推荐
相关产品推荐

