2014-11-17 9 views
0

Мы должны поменять верхнюю половину нижней половиной, и мой код делает это, но проблема в последней строке - это «C:> FILE_NAME». Но C в этой строке находится на втором и последнем. Также отсутствует одна строка. Я пытался играть с цифрами в CX, но я никуда не денусь. Вот код:Swap vga text screen половинки с использованием сборки x86

;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-битные регистры AX и BX, а затем скопировать атрибуты.

Все переопределение сегмента не нужны и вам нужно всего лишь скопировать 12 строк, поэтому установите CX до 12.

+0

спасибо! я делал это 13, потому что я выяснял способ разрешить тот факт, что одна строка отсутствует при копировании, но я предполагаю, что это нормально. теперь все, что осталось сделать, это сделать со строковыми операциями :) –