2011-02-24 4 views
2

그래서, 문자를 묻고, 그것을 읽고, 반복하고, 4 번 반복 한 다음 그 문자를 연속적인 문자열로 출력하는 어셈블리 프로그램을 마쳤습니다. 나는 그 (우리가 아직 클래스에 대해 배운하지 않은) 서브 루틴을 실험하고 싶었다, 그래서 나는 콘솔에 개행 문자를 인쇄하려면 다음 서브 루틴을 만들어 : 그것은 다음과 같이 "라는"됩니다서브 루틴 내에서 TRAP 루틴 사용? - LC3 어셈블리

PRINT_NEWLINE       ;procedure to print a newline 
    AND R0,R0,#0      ;clear output register 
    LD R0,NEWLINE     ;load newline into output regiester 
    TRAP x21       ;print it out 
    RET         ;jump to address in R7 

:

JSR PRINT_NEWLINE 

이를 실행 한 후, 내가 뭔가 이상한 발견, 프로그램은 PRINT_NEWLINE에 대한 첫 번째 호출 후 중지하는 것 같았다. 그런 다음 TRAP이 RETR7에있는 서브 루틴 링크에 사용되는 레지스터 인 다음 명령어의 주소를 저장한다는 것을 알았습니다. 그러면 R7에 저장된 주소가 JSR으로 덮어 씁니다. 그래서 멈추는 이유는 TRAP 루틴이 완료된 후 내 RET 명령을로드하기 때문입니다. 실제로, TRAP 때문에 pc 카운터를 자체로 변경합니다. 무한 루프와 비슷합니다.

그게 전부예요. 무슨 일이 일어나는지 알지만, 시스템 JSR을 사용하면서 시스템 서브 루틴 내에서 TRAP 루틴을 사용할 수있는 방법이 있습니까?

나는 물론, 수동으로 PRINT_NEWLINE 서브 루틴, 그 레지스터의 주소로 JMP의 끝에 다음 다른 레지스터에 JSR PRINT_NEWLINE 호출 후에 명령어의 주소를 저장하고있다.

그러나 그것은 프로그래머이기 때문에 게으르며 다른 노동의 결실을 즐기고 JSRRET의 조합을 사용합니다.

따라서 서브 루틴에서 TRAP 루틴을 호출하고 RET을 사용하여 해당 서브 루틴에서 "반환"할 수 있습니까? 어떻게 이것을 달성 할 수 있을까요?

고마워요!

답변

3

TRAP을 호출하고 나중에 복원하기 전에 R7 값을 다른 곳에 저장해야합니다. 중첩 된 서브 루틴 호출의 경우에도이 작업을 수행해야합니다. 대부분의 RISC 아키텍처는 사용자가 리턴 주소를 저장해야합니다. x86 프로세서처럼 하드웨어에 메모리 스택을 구현하지 않습니다.

+0

+1 감사합니다. 이것은 내가 알고 싶었던 바로 그 것이다. 따라서 통화 전에 항상 반송 주소를 저장하는 것이 가장 좋습니다. – Alex

+0

@Alex : 특히 LC3에 익숙하지는 않지만 일반적으로 리프 절차 (절차 자체를 호출하지 않는 절차)는 반환 절차를 저장하지 않으며 다른 절차는 수행합니다. PowerPC 어셈블리를 모르는 경우에는 읽기가 어렵지만, http://linuxgazette.net/117/pramode.html ("서브 루틴 호출"이라는 섹션 참조)에서는 해당 플랫폼에 이전 반환 주소를 저장하는 방법에 대해 설명합니다. –

관련 문제