Запись ALP для отображения символов ASCII от 32 до 127 в определенном окне (5,10 и 20,70) с атрибутом white on blue

#assembly #x86 #emu8086 #microprocessors

# #сборка #x86 #emu8086 #микропроцессоры

Вопрос:

Для этого вопроса я очистил экран как единственный для (5,10 и 20,70), как указано в вопросе, и установил курсор на (5,10).) Но он будет печатать все символы за пределами определенного окна (вид переполнения). Я хотел напечатать все символы только внутри определенного окна. Как я могу этого добиться??

Вот мой код:

 .model small
.stack 64
.data       
.code
    main proc far
        mov ax, @data
        mov ds, ax
        
        mov ax, 0600h
        mov bh, 17h
        mov ch, 5
        mov cl, 10
        mov dh, 20
        mov dl, 70
        int 10h 
        
        mov ah, 02h
        mov bh, 00h
        mov dh, 05h
        mov dl, 0ah
        int 10h 
                  
        mov ah, 02h          
        mov dx, 32 
    l1: int 21h
        inc dx
        cmp dx, 127
        jne l1
        
        mov ax, 4c00h
        int 21h
        main endp
    end main
 

Спасибо!

Ответ №1:

Ни BIOS ( int 10h ), ни DOS ( int 21h ) не останутся в окне, которое вы очистили до WhiteOnBlue . Вы должны управлять своими собственными переводами строк.

Задача просит вас напечатать 96 символов (127 — 32 1 ) всего (коды ASCII от 32 до 127).
В окне, которое простирается от 10 слева до 70 справа, можно ли разместить 61 символ (70 — 10 1 ).

Конечно, есть много хороших решений для такой задачи. Ниже приведен один из них.

Я решил напечатать полную строку из 61 символа, а затем напечатать оставшиеся 35 символов в строке ниже. Для этого мне пришлось установить курсор во второй раз.

     mov bh, 00h     ; DisplayPage

    mov dx, 050Ah   ; Leftside (10) on 1st row (5) in the window
    mov ah, 02h     ; BIOS.SetCursor
    int 10h
    mov ax, 0E20h   ; BIOS.Teletype starting at ASCII 32
T1: int 10h
    inc al
    cmp al, 93
    jb  T1

    mov dx, 060Ah   ; Leftside (10) on 2nd row (6) in the window
    mov ah, 02h     ; BIOS.SetCursor
    int 10h
    mov ax, 0E5Dh   ; BIOS.Teletype starting at ASCII 93 == 32   61
T2: int 10h
    inc al
    cmp al, 128
    jb  T2
 

Дополнительные примечания:

  • Избегайте использования таких меток, как l1 . Букву smallcaps l легко спутать с цифрой 1 .
  • Попробуйте написать несколько значимых комментариев в своих программах. Посмотрите, что я написал. Особенно числа, для которых вы не добавили комментарий, быстро классифицируются как магические числа, и это мало кому нравится!