Распечатать цветную строку - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь напечатать цветную строку в сборке, но она не работает.

DATA:
MSG db 'hey$'

PROC PrintScore
push bp
mov bp,sp
push ax
push bx
push cx
push dx
; set cursor location to (dl,dh)
MOV AH,09H
MOV BH, 0
MOV BL,4 ;4=RED
mov cx, 10
int 10h
mov bh, 0
mov ah, 2h
mov dh, 0
mov dl, 0   ;that will put the cursor location up left
int 10h
;print the string
mov dx, offset Score 
mov ah, 9h
int 21h
pop dx
pop cx
pop bx
pop ax
pop bp  
ret
ENDP PrintScore

Ответы [ 2 ]

4 голосов
/ 21 апреля 2019

Вы неправильно используете функции прерывания:

INT 10h, AH=09h печатает несколько одинаковых символов одновременно. Счет передается в регистр CX. Чтобы напечатать строку, вы должны вызывать ее так часто, как символы в строке, с другими установленными параметрами. Символ должен быть передан в регистр AL, а атрибут / цвет должен быть передан в регистр BL. BH должно (вероятно) остаться 0, а CX должно остаться 1. DL и DH не используются этой функцией, поэтому вы можете удалить соответствующие команды.

Исходную позицию курсора можно установить с помощью функции INT 10h, AH=02h. Убедитесь, что значение BH соответствует значению в приведенном выше коде (0).

Итак, ваш код может выглядеть так:

  ; ...
  ; Print character of message
  ; Make sure that your data segment DS is properly set
  MOV SI, offset Msg
  mov DI, 0      ; Initial column position 
lop:
  ; Set cursor position
  MOV AH, 02h
  MOV BH, 00h    ; Set page number
  MOV DX, DI     ; COLUMN number in low BYTE
  MOV DH, 0      ; ROW number in high BYTE
  INT 10h
  LODSB          ; load current character from DS:SI to AL and increment SI
  CMP AL, '$'    ; Is string-end reached?
  JE  fin        ; If yes, continue
  ; Print current char
  MOV AH,09H
  MOV BH, 0      ; Set page number
  MOV BL, 4      ; Color (RED)
  MOV CX, 1      ; Character count
  INT 10h
  INC DI         ; Increase column position
  jmp lop
fin:
  ; ...

Функция DOS INT 21h, которая печатает строку до конца-символа $, не заботится о атрибуте, переданном в функцию BIOS INT 10h, поэтому цвет игнорируется, и вы можете удалить соответствующий код от ;print the string до INT 21h.

3 голосов
/ 21 апреля 2019

Почему ваша текущая программа не работала, в ответе zx485 уже объяснили. Согласно вашему комментарию вы действительно можете распечатать всю цветную строку за один раз. BIOS предлагает нам функцию видео 13h . Полный указатель на текст ожидается в ES:BP, поэтому убедитесь, что регистр сегмента ES настроен правильно.

score db '12345'

...

PROC PrintScore
    pusha
    mov     bp, offset score ; ES:BP points at text
    mov     dx, 0000h        ; DH=Row 0, DL=Column 0
    mov     cx, 5            ; Length of the text
    mov     bx, 0004h        ; BH=Display page 0, BL=Attribute RedOnBlack
    mov     ax, 1300h        ; AH=Function number 13h, AL=WriteMode 0
    int     10h        
    popa
    ret
ENDP PrintScore
...