汇编程序索引显示问题求助: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
相关产品推荐
相关产品推荐

