2017-12-09 17 views
-1

목표가 트랩 (PUTS)을 모방 한 서브 루틴을 작성하고 콘솔에 문자열을 쓰는 것입니다.이 문자열 addres는 r0LC3 서브 루틴 - 사용자 정의 트랩 루틴

으로 가정 할 수 있습니다.

이것은 내가 지금까지 가지고있는 것인데, 첫 번째 문자 's'에 대해 작동합니다. 이후 루핑 인쇄를 계속합니다. >>>>>> ive는 모든 제안을 시도 했습니까?

.orig x3000 
lea r0, string ; 


br putss 




putss 

    ldr r1, r0,#0 
    add r0, r1,#0 
    add r4, r0, #-4 
    brz theend 
    out 
    and r1,r1,#0 
add r0,r0,#1 ; keeps fetching next chara 


    br putss 





    theend 
    halt 









    string .STRINGZ "salazar" 

    .end 
+0

모든 제안 사항을 매우 높이 평가합니다. – rahulchawla

답변

0

좋아

1.

br putss 

서브 루틴은 JSR로 불린다. 서브 루틴으로 분기해야한다면, 일단 서브 루틴이 끝나면 제어 흐름은 서브 루틴 호출자에게 어떻게 돌아갈 것입니까?

또 다른 점은 서브 루틴 내에서 TRAP을 호출해야하는 경우 TRAP을 호출 할 때 R7에 반환 주소를 쓰게되므로 R7을 저장하고 복원해야한다는 점입니다. 발신자. 아마도 이것이 대신 BR을 사용한 이유입니다.

2.

add r0, r1,#0 

이 나쁜입니다. 이렇게하면 서브 루틴 호출시 R0에 포함 된 문자열 데이터의 주소가 깨집니다. 왜 이러는거야? 선량률 R1이 ... 일어날 때

3.

and r1,r1,#0 

이 불필요한 것

, 당신은 R1의 값을 덮어 쓰게됩니다.

4.

add r4, r0, #-4 

불필요한 것 같은데? PUTS는 값이 0 인 문자를 읽을 때 끝납니다 (nul 종결 자). 단순히 호출자에게 반환 RET를 사용해야 완료되면

theend 
halt 

5.

는 서브 루틴에 서브 루틴을이 작업을 수행하지 마십시오. 다른 사람의 서브 루틴을 호출하면 프로그램이 종료되기를 원하지 않을 것입니다.

+0

1. 코드가 어떻게 돌아가는지 살펴 보겠다. 트랩이 실행 된 후 RET 라인이되지 않을까? 2. 트랩 OUT이 숯을 r0에 인쇄했기 때문에 그렇게했습니다. 4. 행 끝을 확인했습니다. (puts는 전체 질문을 사용할 수 없습니다.) @Brandon – rahulchawla

+0

1. 이전 문 "완료되면 서브 루틴은 다른 사람의 서브 루틴을 호출하면 프로그램이 종료되기를 원하지 않을 것입니다. " 2. 확인. 하지만 당신은 여전히 ​​R0에 무엇이 있는지 모릅니다. R0의 값을 다른 레지스터로 이동해야합니다. 그렇지 않으면 나머지 문자를 인쇄 할 수 없습니다. 하나는 자신의 OUT 함정을 굴릴 수 있습니다. 4. 위에서 언급 한 바와 같이, PUTS는 널 터미네이터 문자를 얻으면 끝납니다. – Brandon