数组和彩色文本的麻烦

时间:2017-06-22 14:51:20

标签: 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]
    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]

2 个答案:

答案 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

此处leaload effective address指令。