汇编程序存储多组5字符姓名仅显示最后一个,求解决方法
问题分析与修复方案
你的代码问题核心在于每次输入姓名时都从数组起始位置写入,覆盖了之前的内容,同时显示逻辑也存在指针步长错误,导致无法遍历所有存储的姓名。以下是具体修复步骤:
1. 新增存储位置追踪变量
在数据段中添加一个变量,用于记录下一个姓名应该写入的数组位置,避免每次都从开头覆盖:
data segment prompt db 'Enter name (5 chars): $' nume db 100 dup(?) ; 预留足够空间存储多个姓名 next_nume dw offset nume ; 追踪下一个可用存储位置 data ends
2. 修正姓名输入代码
修改输入逻辑,每次从next_nume指向的位置写入新姓名,并更新该变量到下一个可用位置:
scrienume: ; 打印提示信息 mov dx, offset prompt mov ah, 9 int 21h ; 读取输入字符串 mov cx, 5 mov si, [next_nume] ; 从下一个可用位置开始写入 read_char: mov ah, 1 int 21h cmp al, 0ah ; 检查是否按下回车 je end_of_string mov [si], al ; 存储字符到数组 inc si loop read_char end_of_string: mov byte ptr [si], '$' ; 添加字符串终止符 inc si ; 移动到终止符的下一个位置 mov [next_nume], si ; 更新下一次写入的起始位置 jmp bucla
3. 修正姓名显示代码
调整显示逻辑,通过追踪next_nume判断是否遍历完所有姓名,并正确跳转到下一个姓名的起始位置:
lista: mov si, offset nume ; 从数组开头开始遍历 print_names: cmp si, [next_nume] ; 检查是否到达已存储姓名的末尾 je end_print ; 打印当前姓名 mov dx, si mov ah, 9 int 21h ; 打印换行(可选,优化可读性) mov dl, 0dh mov ah, 2 int 21h mov dl, 0ah mov ah, 2 int 21h ; 跳转到下一个姓名的起始位置 find_terminator: cmp byte ptr [si], '$' je move_to_next inc si jmp find_terminator move_to_next: inc si ; 跳过当前姓名的终止符 jmp print_names end_print: jmp bucla
修复说明
- 存储逻辑:通过
next_nume变量记录下一次写入的起始位置,确保新姓名追加到数组末尾而非覆盖旧内容。 - 显示逻辑:遍历数组时,通过对比
si与next_nume判断是否结束,同时通过寻找$终止符定位下一个姓名的起始位置,兼容用户提前按回车输入短姓名的场景。 - 可选优化:添加换行输出,让每个姓名单独占一行,提升可读性。
内容的提问来源于stack exchange,提问作者Andrei2308
相关产品推荐
相关产品推荐

