-1

我想知道是否可以更改字符串中每个字符的属性?

例如,在字符串“hello”中,字符“h”将具有不同的颜色,与“e”相同,依此类推。

我使用 AH, 06 来调用字符串中的每个字符。然后使用 AH, 09 INT 10h 更改每个字符的属性,但它不起作用。

我想知道 AL (in AH, 09) 如何获得 DL (AH, 06) 并更改每个字符的属性。

这可能吗?

谢谢您的帮助

这是我的代码

`

.DATA
    hello   DB      "hello$" 

.CODE

START:
    MOV AX, @DATA
    MOV DS, AX

    LEA SI, hello

    MOV CX, 0005H 
E:  MOV AH, 06H
    MOV DL, [SI]
    INC SI
    ;INT 21H
    LOOP E

    MOV CX, 0005H   
    MOV AH, 09H
    MOV AL, [SI]
    INC SI
    MOV BL, 0001H
H:  INT 10H
    INC BL
    LOOP H



    MOV AX, 4C00H
    INT 21H

    END START   `
4

1 回答 1

0

首先,此代码不是 Windows,它是调用 BIOS 视频例程的 16 位 DOS 代码。

主体调用 INT 10H,该调用的文档在这里:http ://en.wikipedia.org/wiki/INT_10H

对于 int 10H,9 这是相关行:

在光标位置写入字符和属性 AH=09h AL = Character, BH = Page Number, BL = Color, CX = Number of times to print character

这意味着您正在犯一些错误:

  1. 您不能CX用作循环计数器,因为它是调用的参数。
  2. 颜色进入bl所以不要硬编码。
  3. bh是页码,但你没有bh在任何地方设置。
  4. 增加 bl 然后将其重置回 1 显然会将其修复为1
  5. 您已经si在第一个循环中增加了字符串的整个长度,因此在第二个循环中您正在读取字符串的末尾(典型的缓冲区溢出)。在第二个循环开始时,您需要重复lea.
  6. 自从使用 80486 以来loop是个坏主意,因为它比等效的要慢得多sub reg,1; jnz label;除此之外loop,它与cx登记册相关联,这很尴尬。

如果您使用 BIOSint调用速度几乎不是要求,但这不是重点。
如果您想学习 x86 汇编,您还应该学习不要在新处理器上使用旧的 cisc 指令。

于 2013-10-16T00:55:19.033 回答