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

汇编语言中如何在字符串末尾添加空字符?

问题解决:给反转后的字符串添加空字符

首先,你的代码有两个关键问题需要修正:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:35:16