汇编语言中如何在字符串末尾添加空字符?
问题解决:给反转后的字符串添加空字符
首先,你的代码有两个关键问题需要修正:
1. 源字符串索引(esi)的初始值错误
你当前把esi指向了OFFSET target - 2,这完全不对——你应该让它指向源字符串的最后一个有效字符(也就是末尾空字符的前一位)。正确的写法是:
mov esi, OFFSET source + SIZEOF source - 2
或者更灵活的写法:
lea esi, [source + SIZEOF source - 2]
因为SIZEOF source包含了末尾的空字符,所以减2才能定位到最后一个实际字符。
2. 添加空字符的方式错误
add target[edi], 0x00本质上是做了个无意义的加法(加0等于没操作),要给字符串末尾赋值空字符,直接用mov指令把0写入目标位置即可:
mov target[edi], 0
额外优化:调整循环次数
原代码用SIZEOF source作为循环次数,会把源字符串末尾的空字符也反转到目标里,这没必要。我们只需要反转实际的字符,循环次数改成SIZEOF source - 1就够了,最后手动添加空字符。
修正后的完整代码
.386 .model flat, stdcall .stack 4096 ExitProcess proto, dwExitCode:dword .data source BYTE "This is the string that will be reversed", 0 target BYTE SIZEOF source DUP('#') ; 空间足够,包含空字符位置 .code main proc ; 指向source最后一个有效字符(空字符前一位) mov esi, OFFSET source + SIZEOF source - 2 mov edi, 0 ; target的起始索引 mov ecx, SIZEOF source - 1 ; 循环次数:只反转实际字符,不含空字符 LOOPM : mov al, [esi] ; 取source当前字符 mov target[edi], al ; 存入target inc edi ; target索引+1 dec esi ; source索引-1(往前取字符) loop LOOPM ; 在target末尾添加空字符 mov target[edi], 0 invoke ExitProcess, 0 main endp end main
这样修改后,反转后的字符串就会以正确的空字符结尾,符合C风格字符串的要求了。
内容的提问来源于stack exchange,提问作者CricketsAndCrazy
相关产品推荐
相关产品推荐

