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

汇编语言实现非空行按规则编号的技术求助

非空行编号汇编实现方案

需求明确

  • 为输出的非空行添加从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:42:48