그래서, 문자를 묻고, 그것을 읽고, 반복하고, 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이
RET
인
R7
에있는 서브 루틴 링크에 사용되는 레지스터 인 다음 명령어의 주소를 저장한다는 것을 알았습니다. 그러면
R7
에 저장된 주소가
JSR
으로 덮어 씁니다. 그래서 멈추는 이유는
TRAP
루틴이 완료된 후 내
RET
명령을로드하기 때문입니다. 실제로,
TRAP
때문에 pc 카운터를 자체로 변경합니다. 무한 루프와 비슷합니다.
그게 전부예요. 무슨 일이 일어나는지 알지만, 시스템 JSR
을 사용하면서 시스템 서브 루틴 내에서 TRAP
루틴을 사용할 수있는 방법이 있습니까?
나는 물론, 수동으로 PRINT_NEWLINE
서브 루틴, 그 레지스터의 주소로 JMP
의 끝에 다음 다른 레지스터에 JSR PRINT_NEWLINE
호출 후에 명령어의 주소를 저장하고있다.
그러나 그것은 프로그래머이기 때문에 게으르며 다른 노동의 결실을 즐기고 JSR
과 RET
의 조합을 사용합니다.
따라서 서브 루틴에서 TRAP
루틴을 호출하고 RET
을 사용하여 해당 서브 루틴에서 "반환"할 수 있습니까? 어떻게 이것을 달성 할 수 있을까요?
고마워요!
+1 감사합니다. 이것은 내가 알고 싶었던 바로 그 것이다. 따라서 통화 전에 항상 반송 주소를 저장하는 것이 가장 좋습니다. – Alex
@Alex : 특히 LC3에 익숙하지는 않지만 일반적으로 리프 절차 (절차 자체를 호출하지 않는 절차)는 반환 절차를 저장하지 않으며 다른 절차는 수행합니다. PowerPC 어셈블리를 모르는 경우에는 읽기가 어렵지만, http://linuxgazette.net/117/pramode.html ("서브 루틴 호출"이라는 섹션 참조)에서는 해당 플랫폼에 이전 반환 주소를 저장하는 방법에 대해 설명합니다. –