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

汇编程序存储多组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:25:19