You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编代码输出顺序不符预期的原因及正确实现咨询

问题分析与解决

核心问题

  • 字符串无终止符:.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:42:17