如何在汇编语言中让反转字符串提示语与结果同行显示?
问题分析
你的程序出现换行问题,核心原因是用户输入字符串时按下的换行符(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
相关产品推荐
相关产品推荐

