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

汇编程序索引显示问题求助:DOSBox下姓名带序号输出异常

问题分析与修复方案

核心错误点

1. 序号index输出逻辑错误

int 21h的09h功能要求输出内容是以$结尾的字符串,但你直接传递index字节变量的地址,程序会把该字节的ASCII值对应的字符输出(比如index值为1时,输出的是ASCII控制字符而非数字'1'),这会导致乱码或程序异常。

2. 姓名指针被错误重置

在inc byte ptr index之后,你执行了mov dx, offset nume,强制将dx重置为姓名数组的首地址,导致每次循环都输出第一个姓名,完全抵消了add dx,5+1的指针移动操作。

3. 硬编码姓名长度不合理

add dx,5+1假设每个姓名固定占6字节,但实际输入的姓名长度可能不同,且未考虑姓名存储的分隔标记(如$或0),指针移动逻辑不通用,容易触发内存越界。

修复后的代码示例

; 提前定义辅助变量
index_str db '1$'     ; 存储序号的字符串,以$结尾
num_counter db 1      ; 序号数值计数器

lista:
  mov  dx, offset nume
print_names:
; 执行换行操作
push dx
  mov  dl, 13
  mov  ah, 02h
  int  21h
  mov  dl, 10
  mov  ah, 02h
  int  21h
pop  dx

; 转换序号数值为ASCII并输出
mov al, num_counter
add al, '0'           ; 将数字转为对应的ASCII字符
mov index_str, al     ; 更新序号字符串的数字部分
mov dx, offset index_str
mov ah, 09h
int 21h
inc num_counter       ; 递增序号计数器

; 输出当前姓名
mov ah, 09h
int 21h

; 定位到下一个姓名(假设每个姓名以$结尾)
find_next_name:
inc dx
cmp byte ptr [dx], '$'
jne find_next_name
inc dx                ; 跳过$,指向下一个姓名的起始位置

; 判断是否遍历到最后一个姓名
cmp dx, numePointer
jb print_names
jmp bucla

额外说明

  • 若你的姓名是固定长度存储(比如每个占6字节),可以将找下一个姓名的逻辑换回add dx,6,但绝对不能在循环内重置dx到nume的首地址。
  • 若序号需要支持大于9的情况,需额外处理十位数字的转换与输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:35:16