Assembly 数组和彩色文本有问题
我想用这个程序给一些字母上色:Assembly 数组和彩色文本有问题,assembly,emu8086,Assembly,Emu8086,我想用这个程序给一些字母上色: markText proc mov ax,data mov ds,ax mov es,ax mov cx, M mov dx, 1 push dx mov Counter, 0 mov si, 0 colorText: mov ah,13h ;SERVICE TO DISPLAY STRING WITH COLOR. push ax mov al,[CharMas+si
markText proc
mov ax,data
mov ds,ax
mov es,ax
mov cx, M
mov dx, 1
push dx
mov Counter, 0
mov si, 0
colorText:
mov ah,13h ;SERVICE TO DISPLAY STRING WITH COLOR.
push ax
mov al,[CharMas+si]
cbw
mov bp, ax;STRING TO DISPLAY.
inc si
pop ax
mov bh,0 ;PAGE (ALWAYS ZERO).
mov bl,Color
mov L, cx
xor cx, cx
mov cx,1 ;STRING LENGTH.
mov dl,0 ;X (SCREEN COORDINATE).
mov dh,b.ColorRepeat ;Y (SCREEN COORDINATE).
int 10h ;BIOS SCREEN SERVICES.
mov cx, L
inc ColorRepeat
loop ColorText
mov AX,4C00h
int 21h
markText endp
在我的数组(CharMas)中,我得到了类似于'a','b','c'的smth。但是只有一个黑色的空白而不是彩色的字母。我的代码有什么问题
另外,如果我将arr的索引更改为0或1,它将非常有效,例如:
mov bp, offset CharMas[0]
“写入字符串”BIOS函数需要指向ES:BP中输出字符串的指针。这正是您的“好”代码所做的:
mov bp, offset CharMas[0]
但是,您的“坏”代码
将字符串中的1字节加载到bp
。您需要做的是将指向该字节的指针放入bp
。您可以这样做:
mov bp, offset CharMas[0]; now bp is a pointer to the string
add bp, si; now bp is a pointer to a specific byte in the string
或者实际上,您可以使用一条指令来执行此操作:
lea bp, CharMas[si]; now bp is a pointer to a specific byte in the string
这里lea
是说明
您选择了一个更难的BIOS函数来输出彩色字符。此外,您没有正确使用参数
幸运的是,有一个非常友好的功能,你可以使用
mov si, OFFSET CharMas
mov cx, 1
mov bh, 0
mov bl, color
Again:
mov ah, 09h
lodsb ;Get next character from array
int 10h ;Outputs the colored character
mov ax, 0E0Ah ;0Ah=Linefeed
int 10h ;Advances the cursor to the next line
cmp byte ptr [si], 0
jne Again
CharMas db 'a','b','c',0
在dseg:CharMas DB 50 dup(13)中,在填充“r”、“g”、“u”、“h”、“u”、“u”、“u”之后,尝试在您的问题中包含
CharMas
和b
的声明以及任何其他有用的内容。另一个伟大的解决方案,我将在将来记住它。谢谢我真的不确定我是否同意这是一个更加友好的用户界面。您仍然需要获得正确的参数,但是您的解决方案需要更多的代码,更不用说速度较慢。你真正需要做的就是遵循文档,不管你要使用哪个函数。@CodyGray我为准备所做的所有测试都表明Fifoernik提供的代码既不长也不慢。别忘了OP(ab)使用BIOS WriteString函数13h只输出一个字符,因此承受了很大的BIOS开销。但我说的更笼统。您的测试是否实际表明,该循环(以及所有内容的LODSB
)打印中等长度字符串的速度与BIOS函数的速度相同?我想这是可能的,如果你有一个特别低效的BIOS实现…顺便说一句,@Sep,谢谢你把问答放在一起。对于我们遇到的所有“调试我的文本输出”问题来说,这看起来是一个很好的典型的重复目标@CodyGray如果使用BIOS WriteString函数只需一次调用即可输出整个字符串,那么只要所涉及的字符串达到一定长度,就无法击败它。我发现的临界点是4个字符。此BIOS视频功能13h还要求设置AL
以指定子功能。看见
mov ah,13h ;SERVICE TO DISPLAY STRING WITH COLOR.
mov si, OFFSET CharMas
mov cx, 1
mov bh, 0
mov bl, color
Again:
mov ah, 09h
lodsb ;Get next character from array
int 10h ;Outputs the colored character
mov ax, 0E0Ah ;0Ah=Linefeed
int 10h ;Advances the cursor to the next line
cmp byte ptr [si], 0
jne Again
CharMas db 'a','b','c',0