2017-04-24 2 views
2

emu8086을 사용하여 화면에서 문자를 바운스 할 때 도움이 필요했습니다. 화면 크기는 (80x25 문자)입니다. 나는 그것을 대각선으로 움직일 수 있었지만 되돌아 오지 않는다. 대신에 그것은 boundry (즉, 24 번째 행)에 도달 한 후 x 축으로 직선으로 간다. 지금까지 내가 한 일이 여기에있다.어셈블리에서 문자를 바운스하는 방법

enter code here 
Data_seg segment 'data' 
char db 'A' 
char2 db ' ' 
x1 db (1) 
y1 db (1) 
Data_seg ends 

Code_seg segment 'code' 
assume CS:Code_seg,DS:Data_seg 

main PROC far 
    mov ax,Data_seg 
    mov ds,ax 


    mov cx,40 
    loop1: 
    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H 

    ;print a 
    mov al,char 
    mov dl,al 
    mov ah,02H 
    int 21H 

    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H  

    ;print " "  
    mov dl,char2 
    mov ah,02H 
    int 21H  

    inc x1  
    inc y1 

    ;if(x1<2)||(x1>79) 
    mov al,x1 
    cmp al,2 
    jl ifPart 
    mov al,x1 
    cmp al,79 
    jge ifPart  


    ;if(y1<2)||(y1>79) 
    y11:  
    mov al,y1 
    cmp al,2  
    jl ifPart2 

    mov al,y1 
    cmp al,24 
    jge ifPart2 ;jge for boundry(24) 

    jmp endif    
       ifPart: 
         dec x1 
         jmp y11 

       ifPart2: 
        dec y1 

       endif: 


    loop loop1 



    Code_seg ends 
end main 

답변

3

코드에 바운싱 알고리즘/로직을 작성해야합니다. 귀하의 로직은 항상 [+ 1, + 1]을 수행하고 행 24에 도달 한 후에 추가 [0, -1]을 시작합니다 (따라서 총 변경은 (+ 1, + 0)입니다). 79 열에 도달하면 추가 [-1,0]을 수행하므로 전체 변경은 (+ 0, + 0)이됩니다.

즉, 코드는 거기에 작성한 코드를 수행하지만 코드에는 아무런 문제가 없습니다.

논리를 수정하려면 알고리즘을 먼저 일반 언어로 작성하고 (영어 도움말, SO를 물어볼 때) 간단한 단계로 바꾸십시오. 어셈블리 지침과 유사하거나 소스에 주석으로 쓰거나, 몇 가지 지침으로 각 의견을 구현하십시오. 처음에는

, 당신은 "이동"벡터를 할 수 있으며, 대신, [X1, Y1]에 그 추가 :

inc x1 
    inc y1 

(즉, mov al,[moveX] add [x1],al ... 유사 y에 대한).

그런 다음 경계에 도달하면 이동 벡터의 해당 부분을 무효화하므로 +1에서 -1까지 뒤집을 수 있습니다. 시작 위치가 "inside"이면 업데이트 후 경계를 확인하는 것이 좋습니다 (0 || 79 플립 트리거). 시작 위치가 경계에있을 수도있는 경우 업데이트를 시도하고 잘못된 위치를 감지해야합니다 (-1 || 80), 벡터 뒤집기, 유효하지 않은 업데이트 취소 및 유효한 업데이트 수행.

+0

캐릭터가 벡터를 움직여서 지금 튀고 있습니다. 그것이 반송 때 약간의 문제가 발생합니다. 그것은 24 행의 가장 왼쪽 열에있는 문자를 보여줍니다 그리고 반송. –

+0

수정 됨 : "cmp al, 24"를 "cmp al, 23"으로 변경하여 문제 해결 (주석에 설명). 이 프로그램은 이제 완벽하게 작동합니다. 많은 도움을 주셔서 감사합니다. –

+1

@MUHAMMADAHMEDVOHRA 약 24/23 .. DOS 출력 인터럽트 사용에 문제가 없으므로 마지막 줄을 사용할 때 화면을 "스크롤"하게됩니까? 그래픽 카드 내부를 재구성하지 않으면 텍스트 모드가 B800 : 0000에서 시작됩니다. 그래픽 카드 내부를 재구성하지 않으면 텍스트 모드가 시작됩니다. 훨씬 빠르며 VRAM 내용을 완벽하게 제어 할 수 있으므로 모든 256 VGA 문자를 인쇄 할 수 있습니다 가능한 모든 색상/깜박임 조합을 사용하십시오. 그리고 마지막 라인에서 스크롤하지 않아도됩니다 (VRAM 내용을 이동하거나 비디오 메모리 시작을 변경하여 코드를 수동으로 스크롤해야합니다). – Ped7g

관련 문제