2014-11-17 2 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 

또한 1 바이트 만 복사합니다. 즉 속성 (색)을 복사하지 않습니다. 그게 의도적인지 아닌지 나는 모른다. 당신은 16 비트 레지스터 AXBX으로 변경할 수 있으며, 속성도 복사 할 것입니다.

모든 세그먼트 재정의 필요 그리고 당신은 단지 12 개 라인을 복사해야하므로 CX 12

+0

당신을 감사 설정! 나는 한 줄이 복사되지 않는다는 사실을 해결할 방법을 찾았 기 때문에 13을 만들었지 만 정상적인 것 같아요. 이제는 할 일이 남아 있습니다. –

관련 문제