2016-11-07 9 views
2

화면 보호기처럼 텍스트 나 문자를 이동하려는 어셈블리 언어로 프로그램을 만들려고합니다. 즉, 처음에는 앞뒤로 이동해야합니다. 방향. 화면의 하한선에 도달하면 앞뒤로 움직이기 시작해야하며, 반대의 경우도 마찬가지입니다.어셈블리 언어로 텍스트 프로그램 이동

나는 나 자신을 시험해 보았고 동시에 캐릭터를 앞뒤로 움직일 수 있었다. 캐릭터가 화면의 하한선에 도달하면, 나는 그것이 앞으로 및 앞으로 방향으로 움직이기를 원하지만 나는 그것을하는 방법을 생각할 수 없다.

I가 제 1 루프의 각 반복의 마지막 EMU8086 어셈블러

.model small 
.data 
st1 db "O",13,10,'$' 
.code 
main proc 
    mov AX,@data 
    mov DS,AX 

    mov BL,0 
    label1: 
    mov AH,2H 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    ADD BL,1 

    cmp DH,23   ;conditional jump 
    jz label2 
    loop label1 

    label2: 

    ; mov AH,2H 
    ; mov BH,0   ;goto-XY 
    ; mov DH,BL 
    ; mov DL,BL 
    ; INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    SUB BL,1 
    loop label2 

    mov AH,4CH 
    INT 21H 
end main 

사용하고 내 화면의 Y 축 하한이 23 인 경우 낮은 'DH'= 23이기 때문에, 난 검사하고 한계에 도달하면 'label2'로 점프해야하지만, 'cmp'문을 올바르게 사용하지 않아서 'label2'로 점프하지 않습니다. 누구든지이 문제를 해결할 수 있습니까?

내가 도움을 원하는 주요한 것은 'label1'을 (를) 체크인해야 'label2'로 점프해야합니다.

추신. 어셈블리 언어의 초보자 일뿐입니다. 따라서 솔루션을 제안한다면 간단하고 이해하기 쉽도록하십시오. 여기 제가 지금까지 시도한 바가 있습니다.

+1

당신이 사용하는 어셈블리의 버전은 무엇? –

+0

어셈블리 버전이 무슨 뜻인지 잘 모르겠습니다. 당신은 정교 할 수 있습니까? – Yousaf

+0

아키텍처에 따라 여러 가지 버전의 어셈블리 언어가 있습니다. nasm에서 인기있는 어셈블러 중 하나. –

답변

1

두 가지 문제 :

  • 당신은 화면의 하단에 도달 한 경우 23DH 알고 비교,하지만 당신은 화면을 클리어 할 때 DH이 끊어졌습니다. BL을 비교해야합니다.
  • 커서의 위치를 ​​정하기 위해 블록의 주석 처리를 제거하십시오. 여기

는 코드가 해결되었습니다

.model small 
.data 
st1 db "O",13,10,'$' 
.code 
main proc 
    mov AX,@data 
    mov DS,AX 

    mov BL,0 
    label1: 
    mov AH,2H 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    ADD BL,1 

    cmp BL,23   ;◄■■■ COMPARE BL, NOT DH, BECAUSE 
    jz label2   ;  YOU LOST DH WHEN CLEARED SCREEN. 
    loop label1 

    label2: 

    mov AH,2H   ;◄■■■ UNCOMMENT THIS BLOCK !!! 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    SUB BL,1 
    cmp BL,1   ;◄■■■ PERSONAL CHANGE : DETECT WHEN 
    jz label1  ;  CURSOR REACHES THE TOP ☻ 
    loop label2 

    mov AH,4CH 
    INT 21H 
end main 
+1

초당 분할, 몇 초 일찍 응답 :-) – nopasara

+1

문제가 해결되었습니다. 도와 줘서 고마워. – Yousaf

1
mov DL, 79 
mov DH, 24  <-- here Dh = 24 
int 10H 

ADD BL,1 

cmp DH,23  <- so here condition never true 
jz label2 
+0

문제가 해결되었습니다. 도와 줘서 고마워. – Yousaf