2014-11-17 107 views
0

我們應該將上半部分與下半部分交換,而我的代碼是這樣做的,但問題是最後一行應該是「C:> FILE_NAME」。但是那條線上的C是倒數第二。它也缺少一行。我一直在嘗試與CX中的號碼混戰,但我沒有得到任何地方。這裏是代碼:使用x86程序集交換vga文本屏幕的一半

;Swap two halves of the screen crosswise 

JMP START ;This will start the program 

START: 
    MOV AX, 0B800H 
    MOV ES, AX  ;Assign Video Display Area to ES 
    MOV DS, AX  ;Assign Video Display Area to DS 
    MOV SI, 0 
    MOV DI, (80*2)*(12) ;Lower half of screen 

MOV CX, 13  ;Loop for half of screen 

OUTERLOOP: 
    PUSH CX 
    MOV CX, 80 ;COLUMNS. I GET IT NOW! 

INNERLOOP: 
    MOV AL, [DS:SI] 
    MOV B[ES:DI], AL 
    ADD DI, 2 

    MOV BL, [ES:DI] 
    MOV B[ES:SI], BL 
    ADD SI, 2 

LOOP INNERLOOP 

    POP CX   

LOOP OUTERLOOP 

INT 20H 

回答

0

你的內部循環做錯了交換。第一個塊將上半部分的列c中的字符複製到下半部分,然後第二個塊將底部的列c+1中的字符複製到頂部的列c。要進行交換,您應該從兩半讀取同一列並將它們寫回交換。如:

MOV AL, [SI] 
MOV BL, [DI] 
MOV [SI], BL 
MOV [DI], AL 
ADD DI, 2 
ADD SI, 2 

此外它只是複製一個字節,即它不復制屬性(顏色)。我不知道這是否是有意的。您可以更改爲16位寄存器AXBX,然後它將複製屬性。

所有的段覆蓋是不必要的,你只需要複製12行,所以設置CX至12

+0

謝謝!我正在做13,因爲我正在想辦法解決一條線被複制丟失的事實,但我想這很正常。現在剩下要做的就是用字符串操作做到這一點:) –