我想用这个过程为一些字母着色:
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'。但是只有一个黑色的空白而不是彩色字母。我的代码出了什么问题?
P.S。如果我将arr的索引更改为0或1,例如:
,它就可以完美地运行mov bp, offset CharMas[0]
答案 0 :(得分:3)
mov ah,13h ;SERVICE TO DISPLAY STRING WITH COLOR.
您选择了一个较难的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
答案 1 :(得分:1)
"写字符串" BIOS功能需要指向ES:BP中输出字符串的指针。这正是你的好处"代码确实:
mov bp, offset CharMas[0]
然而,你的"坏"代码
mov al,[CharMas+si]
cbw
mov bp, ax
将字符串中的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
是load effective address指令。