Язык ассемблера: почему моя строка напечатана в неправильных местах - PullRequest
1 голос
/ 02 апреля 2020

Я использую dosbox x86 (windows) для запуска этой программы, и я запускаю эту программу с .exe. Ниже приведена часть кода.

.model  tiny
.data
    ui_c    db 0            ; counter for UI column
    _str0 db "Typing HERO!$"
    ...

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

    CALL    rand_init
    MOV     AH, 00h         ;Set size to 80x25
    MOV     AL, 03h
    INT     10h
    MOV     ch, 32          ;hide cursor
    MOV     ah, 1       
    INT     10h 

@UI:    
    MOV     BH,00h
    MOV     AH, 2
    MOV     DL,ui_c
    MOV     DH,19
    INT     10h
    MOV     AH, 9
    MOV     BL, 03h
    MOV     BH, 00
    MOV     CX, 1
    MOV     AL, 178
    INT     10h
    ADD     ui_c,1
    CMP     ui_c, 80
    je      menu
    JB      @UI


;/////////////////////////////////// Print Start Menu ///////////////////////////////////:

menu:   
    MOV AH,09H
    LEA     DX,_str0            ;print _str0 string
    INT 21H

    MOV     AH,13h
    MOV     BH,0h
    MOV     BL,06h
    MOV     AL,00h              ;Write mode
    MOV     CX,12               ;Number of char in Str.
    MOV     DL,35               ; Column
    MOV     DH,3                ; Row
    INT     10h
...
    mov ax,4c00h
    int 21h
main endp
end main

Но вот что я получаю, когда запускаю код:

enter image description here

Я хочу, чтобы моя строка «Typing Hero» находилась в неизвестном месте коричневого цвета, а не под синей цветной линией. Что я должен изменить, чтобы моя строка могла остаться в том месте, где она должна быть.

1 Ответ

1 голос
/ 11 апреля 2020

После вызова DOS для INT 21H вы не установили регистры ES: BP для вызова VGA на INT 13H.

;The cheapest way to set ES to CS on an 8086 is a push/pop

    PUSH CS
    POP ES


;DX already contains the address of the string.

    MOV BP,DX


;The code youve written then follows...

MOV     AH,13h
MOV     BH,0h
MOV     BL,06h
MOV     AL,00h              ;Write mode
MOV     CX,12               ;Number of char in Str.
MOV     DL,35               ; Column
MOV     DH,3                ; Row
INT     10h
...