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

汇编开发:如何将目标字符串末尾指定字节替换为0?

解决x86汇编字符串反转后多余字符问题

你的问题核心是错误处理了整个source的内存区域(包括终止0和后面的%),同时未给反转后的target字符串添加正确的终止0,导致输出包含未覆盖的#和^。以下是具体修正方案:

问题根源

  1. 你用SIZEOF source作为循环次数,会把source中有效字符串后的终止0、4个%全部纳入处理,而这些是不需要反转的。
  2. target初始的SIZEOF source个#未被完全覆盖(有效字符串长度小于SIZEOF source),且反转后未添加终止0,导致输出时会继续读取到后面的#和^。

修正代码

; 第一步:计算source中有效字符串的长度(不含终止0)
mov esi, OFFSET source
mov ecx, 0FFFFh       ; 设置最大查找范围,避免无限循环
mov al, 0             ; 要查找的终止符0
repne scasb           ; 从source开始找第一个0,找到后ecx = 0FFFFh - 有效长度 -1
not ecx               ; 取反后得到 有效长度 +1
dec ecx               ; 现在ecx就是有效字符串的长度(不含终止0)

; 第二步:初始化反转操作的寄存器
mov esi, 0                        ; source的起始索引
mov edi, ecx - 1                  ; target的起始写入位置(有效长度-1,从末尾开始写)
mov edx, ecx                      ; 保存有效长度,后续用来设置终止0

L1: ; 循环反转有效字符
mov al, source[esi]
mov target[edi], al
inc esi
dec edi
loop L1

; 第三步:给反转后的target字符串添加终止0
mov target[edx], 0    ; 有效字符反转完成后,在第edx个位置(索引从0开始)写入0,截断多余字符

代码说明

  • 计算有效长度:用repne scasb指令自动定位source的终止0,避免硬编码字符串长度,适配任意长度的source字符串。
  • 精准循环:循环次数设为有效字符串长度,只处理需要反转的字符,不会碰后面的%和终止0。
  • 添加终止0:在target中有效反转字符串的末尾写入0,输出函数(如printf)会在这个位置停止读取,不会显示后面的#和^。

数据源定义无需修改

你的source和target的定义保持原样即可,终止0会自动截断后续的多余字符。

内容的提问来源于stack exchange,提问作者Zayn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:18:17