汇编开发:如何将目标字符串末尾指定字节替换为0?
解决x86汇编字符串反转后多余字符问题
你的问题核心是错误处理了整个source的内存区域(包括终止0和后面的%),同时未给反转后的target字符串添加正确的终止0,导致输出包含未覆盖的#和^。以下是具体修正方案:
问题根源
- 你用
SIZEOF source作为循环次数,会把source中有效字符串后的终止0、4个%全部纳入处理,而这些是不需要反转的。 - 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
相关产品推荐
相关产品推荐

