装配中的编号线

问题描述 投票:0回答:1

我的问题是我需要根据以下任务在其他一些任务中对行进行编号。 其他的我都做了,但我不知道怎么做这个。 使用从数字 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 '. ','$'
assembly emu8086
1个回答
0
投票

此代码仅生成从 1 到 23 的行号以适合屏幕。将

max_lines
更改为 99。

行号存储在

line_num
中。代码仅修改偏移量
line_num
line_num + 1
处的字节。

如何将文本与行号组合取决于您。 ;)

.model small
.stack 0ffh
.data
    line_num db ' ','1','.',' ',13,10,'$'
    max_lines db 23

.code
main proc
    mov ax,@data
    mov ds,ax

    xor cx,cx
    mov cl,1                            ; line counter  
    mov bx,offset line_num              ; stores line number
    
    show_num:
        mov ah,09h                      ; print line number
        mov dx,bx
        int 21h
        
        inc cl                          ; next line number
        
        cmp cl,9                        ; less or equal 9
        jbe le_9                        
        
        gt_9:
            mov ax,cx                   ; greater than 9    
            mov dl,10
            div dl                      ; al = quotient, ah = remainder
        
            add al,30h                  ; add 30h to al and ah 
            mov [bx],al                 ; because we want ascii '0'-'9'
            inc bx
            add ah,30h
            mov [bx],ah 
            dec bx
        
            jmp next_line
        
        le_9:
            add cl,30h                  ; ascii '1' - '9'
            inc bx                      ; line_num + 1                      
            mov [bx],cl
            dec bx          
            sub cl,30h          
            
            next_line:
                cmp cl, [max_lines]     
                jbe show_num
        
    exit:
        mov ax,4c00h
        int 21h

main endp
end main
© www.soinside.com 2019 - 2024. All rights reserved.