Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 数组和彩色文本有问题_Assembly_Emu8086 - Fatal编程技术网

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