如何使用中断在汇编 8086 中打印彩色字符串
how to use an interrupt to print strings in color in assembly 8086
我正在用汇编 8086 编写一个 NIM 游戏。快完成了,但是我遇到了一个问题。
我有一个打印堆的程序(每堆包含一些木棍)。它运行完美,除了一件事。我想给棒子上色以获得更好的外观。所以我搜索并找到了一个中断:INT 10h / AH = 09h
在描述中表明此中断用于"writing character and attribute at cursor position"。但是,我不习惯用它来写个字符,我用它来为另一个中断设置颜色。
它在某种程度上工作正常,但并非总是如此。所以我想知道它是如何工作的,以及我是否以正确的方式使用它。
我还发现了这里的用法:
How to print text in color with interrupts?
这是我对这些部分的代码:
set_color macro par ;macro to set a color for printing
pusha
mov bl, par
mov ah, 9
mov al, 0
int 10h
popa
endm
这是我打印的地方:
print_pile proc ;print the piles. this is where my problem lies.
pusha
mov al, nl ; print a new line
call print_ch
lea dx, top ;print top of border
call print_msg
xor si, si
mov cx, piles
xor bl, bl
pile_loop: ;print pile number
lea dx, pile_num1
call print_msg
call set_cursor
lea dx, pile_num2
call print_msg
mov temp, si
mov al, b. temp
inc al
add al, 30h
call print_ch
mov al, ' ' ;print sticks in each pile in numbers
call print_ch
mov al, '('
call print_ch
mov al, pile1[si]
add al, 30h
call print_ch
mov al, ')'
call print_ch
mov al, ' '
call print_ch
lea dx, shape
mov bl, pile1[si]
cmp bl, 0
jz no_print
print_loop: ;prints sticks in each pile using an ascii character
set_color light_red ; here i want to print abovesaid shapes in a color
call print_msg
dec bl
cmp bl, 0
jnz print_loop
no_print:
call set_cursor
inc si
dec cx
or cx, cx
jnz pile_loop
lea dx, star2
call print_msg
lea dx, top
call print_msg
popa
ret
print_pile endp
下面是我的问题的说明:
如您所见,最后一堆有两种颜色。
感谢您的帮助。
PS。可以找到我的完整代码 HERE -- 更易于阅读。
PS。我正在使用 emu8086,对不起我的英语。
print_msg (DX=shape)
通过 Int 21h/09
打印两个字符。因此你必须通过Int 10h/09h
为set_color
中的两个字符设置属性。所以插入一个mov cx, 2
:
set_color macro par ;macro to set a color for printing
pusha
mov bl, par
mov ah, 9
mov al, 0
mov cx, 2 ; number of times to write character
int 10h
popa
endm
我正在用汇编 8086 编写一个 NIM 游戏。快完成了,但是我遇到了一个问题。
我有一个打印堆的程序(每堆包含一些木棍)。它运行完美,除了一件事。我想给棒子上色以获得更好的外观。所以我搜索并找到了一个中断:INT 10h / AH = 09h
在描述中表明此中断用于"writing character and attribute at cursor position"。但是,我不习惯用它来写个字符,我用它来为另一个中断设置颜色。 它在某种程度上工作正常,但并非总是如此。所以我想知道它是如何工作的,以及我是否以正确的方式使用它。
我还发现了这里的用法: How to print text in color with interrupts?
这是我对这些部分的代码:
set_color macro par ;macro to set a color for printing
pusha
mov bl, par
mov ah, 9
mov al, 0
int 10h
popa
endm
这是我打印的地方:
print_pile proc ;print the piles. this is where my problem lies.
pusha
mov al, nl ; print a new line
call print_ch
lea dx, top ;print top of border
call print_msg
xor si, si
mov cx, piles
xor bl, bl
pile_loop: ;print pile number
lea dx, pile_num1
call print_msg
call set_cursor
lea dx, pile_num2
call print_msg
mov temp, si
mov al, b. temp
inc al
add al, 30h
call print_ch
mov al, ' ' ;print sticks in each pile in numbers
call print_ch
mov al, '('
call print_ch
mov al, pile1[si]
add al, 30h
call print_ch
mov al, ')'
call print_ch
mov al, ' '
call print_ch
lea dx, shape
mov bl, pile1[si]
cmp bl, 0
jz no_print
print_loop: ;prints sticks in each pile using an ascii character
set_color light_red ; here i want to print abovesaid shapes in a color
call print_msg
dec bl
cmp bl, 0
jnz print_loop
no_print:
call set_cursor
inc si
dec cx
or cx, cx
jnz pile_loop
lea dx, star2
call print_msg
lea dx, top
call print_msg
popa
ret
print_pile endp
下面是我的问题的说明:
如您所见,最后一堆有两种颜色。
感谢您的帮助。
PS。可以找到我的完整代码 HERE -- 更易于阅读。
PS。我正在使用 emu8086,对不起我的英语。
print_msg (DX=shape)
通过 Int 21h/09
打印两个字符。因此你必须通过Int 10h/09h
为set_color
中的两个字符设置属性。所以插入一个mov cx, 2
:
set_color macro par ;macro to set a color for printing
pusha
mov bl, par
mov ah, 9
mov al, 0
mov cx, 2 ; number of times to write character
int 10h
popa
endm