2013-10-13 25 views
-1

我想知道它是否可以更改字符串中每個字符的屬性?在程序集中顯示字符的不同屬性

例如該串中的「hello」的字符「H」將具有不同的顏色,用「E」等是相同的。

我用AH,06撥打字符串中的每個字符。然後使用AH,09 INT 10h來更改每個字符的屬性,但之後它不起作用。

我想知道如何才能AL(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 ` 
+0

我認爲你需要重新閱讀你的問題,因爲它沒有意義的部分。你也沒有指定你正在運行哪個操作系統,如果有的話。 –

+0

我只是想知道是否有可能改變字符串中的字符與不同的文字顏色。防爆。在字符串「hello」中,'h'將是紅色的,'e'將是藍色的,'l'是黃色的,'l'是綠色的,'o'是橙色的。它的Windows x86和我使用tasm。 – Aeri

+0

爲什麼每個學生仍然使用16位彙編器? – Johan

回答

0

首先這個代碼是沒有的Windows,它是16位DOS代碼調用BIOS視頻程序。

主體調用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. 自從使用loop 80486是一個壞主意,因爲它比同等sub reg,1; jnz label慢得多;除了loop綁定到cx寄存器是尷尬的。

如果你正在使用BIOS int調用速度幾乎不是要求,但那不是重點。
如果您想了解x86彙編,您還應該學習不要在新處理器上使用舊的cisc指令。

相關問題