汇编语言实现非空行按规则编号的技术求助
非空行编号汇编实现方案
需求明确
- 为输出的非空行添加从1开始的连续十进制编号,最多支持99行
- 编号格式要求:两位字符开头,后跟“. ”;1-9号需在数字前加空格,示例:
1. 文本、10. 文本
问题现状
其余任务已完成,自行尝试的汇编代码未实现该需求,考虑过栈方案,寻求可行的技术实现建议
原代码片段
... nums inc cx ; mov bx, tens ; cmp bx, 50 ; ja lower ;both mov dx, ones ; mov ah, 9 ; int 21h ; inc dx mov dx, bfrtxt mov ah, 9 int 21h ; mov dx, ones ; cmp dx, 59 ; je reset fork test cx,1 jz oddw1 jnz evenw1 ;lower mov dx, ' ' ; mov ah, 9 ; int 21h ; jmp both ; ;higher mov dx, tens ; mov ah, 9 ; int 21h ; cmp dx, 9 ; jmp both ;reset mov dx, 49 ; jmp fork ... segment data resb 1024 ones db 50 tens db 49 line db 0 bfrtxt db '. ','$'
可行实现方案
不需要用栈,直接维护十位、个位的ASCII字符值即可,逻辑简单高效:
1. 数据段调整
segment data resb 1024 tens db ' ' ; 十位初始为空格,对应1-9行 ones db '1' ; 个位初始为'1',从第1行开始 line_cnt db 1 ; 行号计数器,控制最大99行 prefix db '. ','$' ; 编号后的固定后缀 bfrtxt db '. ','$' ; 原文本前缀(保留原有定义)
2. 编号输出与递增逻辑
替换原代码中的nums块,用int 21h的02h功能输出单个字符(比09h更适合单个字符输出),然后处理编号递增:
nums: ; 输出十位字符(空格或数字) mov dl, [tens] mov ah, 02h int 21h ; 输出个位数字 mov dl, [ones] mov ah, 02h int 21h ; 输出后缀 ". " mov dx, prefix mov ah, 09h int 21h ; 递增行号并更新编号 inc byte [line_cnt] cmp byte [line_cnt], 100 jae skip_inc ; 超过99行则停止编号递增 ; 处理个位递增 inc byte [ones] cmp byte [ones], '9' jle skip_tens_inc ; 个位超过'9',重置为'0',十位加1 mov byte [ones], '0' inc byte [tens] ; 从空格变为'1',后续递增到'9' skip_tens_inc: skip_inc: ; 输出原文本内容(保留原有逻辑) mov dx, bfrtxt mov ah, 09h int 21h fork: test cx,1 jz oddw1 jnz evenw1
逻辑说明
- 用
line_cnt计数器判断是否达到99行,避免编号溢出 - 十位初始为空格,当行号到10时,个位从9变0,十位从空格变'1',自动符合格式要求
- 单个字符输出用
int 21h的02h功能,无需额外的$终止符,比09h更简洁高效
内容的提问来源于stack exchange,提问作者m.54
相关产品推荐
相关产品推荐

