2016-11-08 66 views
0

我儘量讓「#」屏幕和另一側的左側將是「$」上,但它沒有停止對25 * 40如何打印字符在屏幕

.MODEL TINY 

.CODE 

.STARTUP 

    CLD 
    MOV AX, 0B800H ;for open screen 
    MOV ES, AX  
    MOV DI, 0 
    MOV CX, 25*40 ;try to divide screen 
    MOV AX, 5C23H 
    REP STOSW 

    MOV AX, 0B800H 
    MOV DS, AX 
    MOV SI,0 
    MOV CX, 25*40 
    MOV AX, 6F24H 
    REP STOSW 

.EXIT 
END 
+0

您沒有設置在代碼的第二部分正確註冊。你想分割屏幕*垂直*或*水平*?因爲只有後者可以通過連續寫入內存來實現,前者必須實現爲25次獨立運行。 –

+0

爲什麼你把'ds'設置爲'b800'?爲什麼你把'si'設置爲'0'?看起來你把一些隨機指令放入代碼中,然後看看會發生什麼。嘗試用其他方法,定義你想要發生的事情,然後寫出完全相同的指令。 – Ped7g

+0

我試圖垂直分割屏幕,但它不停在40.我怎樣才能解決它? – muco

回答

2
.MODEL TINY 

.CODE 
.STARTUP 

    CLD 
    MOV AX, 0B800H ;for open screen 
    MOV ES, AX 
    XOR DI, DI  ; DI = 0 
    MOV DX, 25  ; lines counter 
line_loop: 
    MOV CX, 40 
    MOV AX, 5C23H 
    REP STOSW 
    MOV CX, 40 
    MOV AX, 6F24H 
    REP STOSW 
    DEC DX 
    JNZ line_loop 

.EXIT 
END 

的樂趣和鍛鍊的xor爲你的權力,代碼更短的變體(試圖跨過它的調試器或頭部,並瞭解它是如何工作):

... 
    XOR DI, DI  ; DI = 0 
    MOV DX, 50  ; 50 half-lines to fill 
    MOV AX, 5C23H ; start with '#' 
half_line_loop: 
    MOV CX, 40 
    REP STOSW 
    XOR AX, 3307h ; 5C23 xor 3307 = 6F24, 6F24 xor 3307 = 5C23 
    DEC DX 
    JNZ half_line_loop 
    ... 
+0

非常感謝你,我有一個問題,你爲什麼要'XOR DI,DI' – muco

+0

@muco,因爲我想將'di'設置爲'0',並且我不關心那個代碼點的標誌,所以我可以使用'xor「self」'而不是'mov target,0'。 'xor'操作碼較短('31 FF = xor di,di'),因爲它不需要編碼'0'編號('BF 00 00 = mov di,0')。唯一不同的是,'xor'也會影響標誌(在這種情況下ZF = 1,結果爲'0',CF = OF = SF = 0)。 – Ped7g

+0

@muco,如果你不知道爲什麼'xor'self''結果爲'0',那麼請閱讀按位運算符:或/和/ xor/not,它們是如何工作的。它們有時非常方便,特別是對於由多個獨立位(通常用作「標誌」)組成的值進行單位操作。 xor的「設置爲零」是一種騙術。 – Ped7g