2016-12-02 1 views
-1

I'v는 출력으로 아래 작성하는 프로그램 작성 AA 작업을 가지고 이하 :어셈블러 MASM, JNZ 루프에서 인쇄 값이 0이거나

ABCD****** 
    ABCD*** 
     ABCD 

내 코드는 다음과 같습니다

kod segment 
org 100h 
assume cs:kod 

start: 
mov cx,3 
mov bx,3 
mov ax,6 

mov ah, 02h 

    PETLA_ZEW: 

    push cx 
    mov cx,4 
    mov dl, 'A' 

     PETLA_CIAG: 

      int 21h 
      inc dl 
      dec cx 

     jnz PETLA_CIAG 

    push ax 
    mov cx, ax 
    mov dl, '*' 

     PETLA_GWIAZD: 

      int 21h 
      dec cx 

     jnz PETLA_GWIAZD 

    sub ax, 3 

    mov dl, 0ah 
    int 21h 
    mov dl, 0dh 
    int 21h 

    push bx 
    mov cx, bx 
    mov dl, ' ' 
     PETLA_SPACJE: 

      int 21h 
      dec bx 

     jnz PETLA_SPACJE 

    pop bx 
    add bx, 3 

    pop cx 
    dec cx 

    jnz PETLA_ZEW 

koniec: 
    mov ah, 4ch 
    int 21h 
kod ends 
end start 

하지만 문제는 PETLA_GWIAZD라는 루프에서 ax 두 번째 시간을 뺄 때 값이 0이기 때문에 무한 루프가 발생합니다. 빼는 데 사용할 다른 루프가 있습니까? 아마도 루프 바로 전에 유효성 검사를 할 것인가? 방금 어셈블리 작업을 시작했지만 여전히 많은 것을 알지 못합니다 ...

Thanks! AXCX 인터럽트 및 루프에 사용되는, 다른 레지스터를 사용할 수 있도록, 예를 들어, SI 대신 CX의 및 DI 대신 AX을 :

+0

무엇 'ax'가 0 일 때 0 별을 출력하는 것이 좋습니다. 따라서 "루프 바로 전에 유효성 검사"에 대한 아이디어는 나에게 잘 들립니다. 그리고 합리적으로 간단한 방법이 있습니다. 'mov cx, ax' 이후에'jcxz SKIP_GWIAZD'를 추가하고'print '코드 부분 앞에'sub ax, 3 '뒤에 새로운 레이블'SKIP_GWIAZD :'를 추가 할 수 있습니다. 다음은 다른 조건부 점프에 대한 설명입니다. http://stackoverflow.com/documentation/x86/5808/control-flow/20470/conditional-jumps#t=201612021937306141986 – Ped7g

+1

아, 실제로 'jcxz'는 여기에 설명되어 있지 않습니다. 죄송합니다. [Here] (http://x86.renejeschke.de/html/file_module_x86_id_146.html)은'jcxz'를 포함한 몇몇 문서입니다. – Ped7g

+0

그래, 방금 다른 점프에 대해 더 읽기 시작했고 여러 가지 변형 + 아이디어를 시도했지만 여전히 효과가없는 것 같습니다. 나는 프로그램 {koniec :}이 끝나기 직전에 {mov cx, ax}와 실제 {SKIP_GWIAZD :} 다음에 {jcxz} {SKIP_GWIAZD}를 추가했지만 여전히 작동하지 않습니다. 나는 마지막 줄에서 마지막 글자가 글자 일 뿐이므로이 방법을 사용했다. 그래서 우리는 그 다음 줄 (빈 줄이나 빈 줄)을 가지고 싶지 않다. – sakcaj

답변

0

문제는 레지스터를 사용하는 것입니다

kod segment 
org 100h 
assume cs:kod 

start: 
mov si,3  ;◄■■ INSTEAD OF CX. 
mov bx,3 
mov di,6  ;◄■■ INSTEAD OF AX. 

mov ah, 02h 

    PETLA_ZEW: 

    mov cx,4 
    mov dl, 'A' 

     PETLA_CIAG: 

      int 21h 
      inc dl 
      dec cx 

     jnz PETLA_CIAG 

    cmp di, 0 ;◄■■ IF COUNTER == 0 ... 
    je koniec ;◄■■ ... NO MORE ASTERISKS. 

    mov cx, di ;◄■■ 
    mov dl, '*' 

     PETLA_GWIAZD: 

      int 21h 
      dec cx 

     jnz PETLA_GWIAZD 

    sub di, 3  ;◄■■ 

    mov dl, 0ah 
    int 21h 
    mov dl, 0dh 
    int 21h 

    push bx 
    mov cx, bx 
    mov dl, '_' 
     PETLA_SPACJE: 

      int 21h 
      dec bx 

     jnz PETLA_SPACJE 

    pop bx 
    add bx, 3 

    dec si  ;◄■■ 
    jnz PETLA_ZEW 

koniec: 
    mov ah, 4ch 
    int 21h 
kod ends 
end start 
+0

@ sakcaj, 나는 공백을 '_'으로 테스트 목적으로 바꿨다 : –

+0

고마워! 네가 옳은 것 같아. 하지만 내가 사용할 수있는 레지스터를 어떻게 알 수 있습니까? 그것들은 기본적으로 모두 "비어있는"것인가? 그리고 그것은 내가 작성한 프로그램에 달려 있는가? 예를 들어 EDX, DX, DH, DL 및 CX 만 사용하여 계산할 수 있습니까? 인터넷에 너무 많은 것이 있습니다 ... – sakcaj

+0

@sakcaj, 일부 레지스터는 인터럽트에 사용되며 다른 명령어는 루프와 같은 일부 명령어에 사용됩니다. 어떤 레지스터를 언제 어떻게 사용하는지 배우는 데 시간이 걸리지 만, 특정 레지스터를 사용하지 않으므로 카운터처럼 사용할 수 있습니다. –