2012-04-14 2 views
3

Easy68k에서 어셈블리 언어 클래스의 추가 프로그램을 작성하고 있지만 동일한 문제가 계속 발생합니다. 이 프로그램을 실행할 때마다 최대 10 개의 숫자 (배열의 할당 된 크기)를 입력 할 수 있으며 계산 중임을 나타내는 메시지가 출력되지만 우물 라우트로 끝나는 y의 출력은 끝이납니다. 내 프로그램에서이 문제를 일으킬 수있는 모든 문제를 즉시 볼 수 있습니까?이 추가 서브 루틴이 작동하는 데 문제가 있습니다.

내가 잘못하고있는 것이 긍정적이기 때문에 서브 루틴 구문을 검색했습니다.하지만 아무 것도 찾을 수 없습니다.

ORG $2000 
ARRAY DS.W 10 
ZDONE  DC.W 'Enter values. Zero when done.' 
FULL  DC.W 'That is all the input allowed. Calculating sum now...' 
OERROR  DC.W 'The values you entered caused an overflow condition.' 
REPEAT  DC.W 'Do you want to repeat? [0=No, 1=Yes].' 

START  ORG  $2800 

MAIN LEA   ZDONE,A1 
     MOVE.B  #14,D0   ; 
     TRAP  #15 
     LEA   ARRAY,A0 

     MOVE.B  #0,D3 
INPUT MOVE.B  #4,D0 
     TRAP  #15 
     MOVE.W  D1,(A0)+ 
     BEQ   SUB 
     ADD.B  #1,D3 
     CMPA  #$2012,A0 
     BNE   INPUT 
     LEA   FULL,A1 
     MOVE.B  #14,D0   ; Outputs the FULL string 
     TRAP  #15 

SUB  SUB.W  A0,A0 
     BSR   SUM    ; Begins to calculate sum 

     CMP   #1,D0 
     BNE   NoV 
     LEA   OERROR,A1 
     MOVE.B  #14,D0 
     TRAP  #15 
     BRA   AGAIN 

NoV  LEA   $D1,A1 
     MOVE.B  #14,D0 
     TRAP  #15 

AGAIN LEA   REPEAT,A1 
     MOVE.B  #14,D0 
     TRAP  #15 
     MOVE.B  #4,D0 
     TRAP  #15 
     MOVE.B  #1,D0 
     CMP.B  D0,D1 
     BEQ   START 
     STOP  #$3800 

     ORG   $3800   
SUM  LEA   ARRAY,A0 
     ADD.W  #$A0,D1 
     BVC   NoV 
     SUB.B  #1,D3 
     BNE   SUM 
     MOVE.B  #1,D0 
     BRA   RETURN 
     CLR.B  D0 
RETURN RTS 
     END   START 

답변

2

ÿ의 홍수는 여기에서 온다 :

NoV  LEA   $D1,A1 
     MOVE.B  #14,D0 
     TRAP  #15 

당신은 A1으로 0xD1의 즉시 값을로드하고 있습니다. 그것이 $의 목적입니다. 즉각적인 주소 지정을 의미합니다. 여기서 디버거가 유용합니다. MOVE.B 행까지 프로그램을 실행하면 A1의 값은 0x000000D1입니다. TRAP을 사용하여 인쇄 할 문자열의 주소입니다. 0x000000D1의 메모리는 무엇입니까? 정의되지 않았습니다. 이 경우 에뮬레이터는 ÿ 문자에 해당하는 0xFF로 메모리를 초기화합니다.

이 잘못 될 수 있습니다

SUB  SUB.W  A0,A0 

당신은 효과적으로 0

에 A0를 설정, A0에서 A0을 공제하고 난 의심이 잘못 너무 :

SUM  LEA   ARRAY,A0 
     ADD.W  #$A0,D1 

추가 D1을 등록하려면 즉치 값이 0xA0입니다.

 ADD.W  A0,D1 

몇 가지 더 :

당신은 SUM의 각 루프의 시작에서 A0로 ARRAY를로드하는 당신은 아마 대신 직접 추가 할 수 있습니다. 루프 전에 이것을 수행해야합니다 :

SUB  LEA   ARRAY,A0 
     BSR   SUM 

SUM 내부에서는 간접 주소 지정을 사용하고 무시하십시오. 이 배열에서 실제 값을 가지고 어큐뮬레이터에 추가합니다 (나는이 D1입니다 가정) : 그것은 바로, 어큐뮬레이터의 현재 값을 표시하는 것처럼

SUM  ADD.W  (A0)+,D1 

십일 보인다? 조건부 분기를 사용하고 있습니다. 좋아요, 합산을 마친 후에는 표시하기를 원할 것입니다. 그러나 BVC는 실제로 하위 지점이 아닙니다! 리턴 포인터를 저장하지 않습니다. 대신에, 나는 카운터가 0에 도달 한 후에 실행 SUM의 부분으로 이동 것이고, 나는 BSR을 사용 : 당신은 여전히 ​​오버플로 일을 얻을 것이다

SUM  ADD.W  (A0)+,D1 
     SUB.B  #1,D3 
     BNE   SUM 
     BSR   NoV 
     MOVE.B  #1,D0 
     BRA   RETURN 
     CLR.B  D0 
RETURN RTS 

참고. 내가 네가하는 일을 이해하지 못해서 네가 알아낼 수있게 해줄거야. 또한 RETURN에 무조건 분기를 사용하기 때문에 CLR이 실행되지 않으므로 SUM이 0을 반환하는 것은 불가능합니다.

이 변경 후에는 NoV를 반환하여 서브 루틴처럼 작동하도록 수정하는 것이 중요합니다 RTS.거기에 당신이 원하는 아마 문자열로 D1의 정수 값을 표시하는 TRAP 값의 참고 : 나는 숫자를 추가하고 결과를 표시하는 얻을 수있는이 시점에서

NoV  MOVE.B  #3,D0 
     TRAP  #15 
     RTS 

이 있지만, 항상 쇼 넘치는 일. 서브 루틴을 수정 한 다음 프로그램의 논리 흐름을 다시 평가하십시오.

+0

몇 가지 시도를 한 후에 답변을 업데이트했습니다. –

관련 문제