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

如何在汇编语言中让反转字符串提示语与结果同行显示?

问题分析

你的程序出现换行问题,核心原因是用户输入字符串时按下的换行符(0xA)被一同读入了buffer,而你的反转逻辑把这个换行符放到了reversed_buffer的起始位置。当你先输出提示语The reversed string is: ,紧接着输出reversed_buffer时,第一个字符就是换行,自然会把反转后的内容挤到下一行。

解决步骤

1. 移除输入字符串末尾的换行符

读取输入后,eax存储的是读取的总字节数(包含换行符),我们需要把buffer中最后一个字节(换行符)替换为空,同时把有效长度减1,避免反转时包含这个换行。

2. 调整反转循环的索引逻辑

修正后有效长度不含换行,需要调整循环中读取字符的索引,确保从字符串最后一个有效字符开始反转。

修改后的完整代码
section .bss
    buffer resb 100
    reversed_buffer resb 100

section .data
    msg db "Please enter a string: ", 0
    msgLen equ $ - msg
    reverse_msg db "The reversed string is: ", 0
    reverse_msg_len equ $ - reverse_msg

section .text
    global _start

_start:
    ; 输出输入提示
    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, msgLen
    int 0x80

    ; 读取用户输入
    mov eax, 3
    mov ebx, 0
    mov ecx, buffer
    mov edx, 100
    int 0x80
    mov esi, eax  ; esi = 读取的字节数(含换行)

    ; --- 新增:移除末尾的换行符 ---
    dec esi                  ; 有效长度减1(去掉换行)
    mov byte [buffer + esi], 0  ; 把换行符替换为空字符

    ; 初始化反转循环的寄存器
    mov ecx, esi
    mov esi, buffer
    mov edi, reversed_buffer

reverse_loop:
    cmp ecx, 0
    jl end_reverse
    dec ecx                  ; 先减索引,从最后一个有效字符开始取
    mov al, [esi + ecx]
    mov [edi], al
    inc edi
    jmp reverse_loop

end_reverse:
    ; 输出反转提示语
    mov eax, 4
    mov ebx, 1
    mov ecx, reverse_msg
    mov edx, reverse_msg_len
    int 0x80

    ; 输出反转后的字符串
    mov eax, 4
    mov ebx, 1
    mov ecx, reversed_buffer
    mov edx, esi  ; 用修改后的有效长度
    int 0x80

    ; 可选:输出换行,让终端提示符回到新行
    mov eax, 4
    mov ebx, 1
    mov ecx, 0xA
    mov edx, 1
    int 0x80

    ; 退出程序
    mov eax, 1
    xor ebx, ebx
    int 0x80
关键修改说明
  • 读取输入后,通过dec esi和mov byte [buffer + esi], 0去掉了末尾的换行符,确保反转内容不包含换行。
  • 调整反转循环中dec ecx的顺序:原逻辑先减索引再循环,现在针对修正后的有效长度,先减索引再读取字符,保证从字符串最后一个有效位置开始反转。
  • 可选添加末尾换行输出,让终端提示符回到新行,提升使用观感。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:12:40