2017-12-06 26 views
0

안녕하세요 메인 프로그램을 작성하지 를 수행 CS 클래스트랩 서브 루틴 LC3 조립

 The puts TRAP routine has been disabled for some reason. Write an LC-3 
     subroutine called puts that 
    implements its behaviour. In other words when the subroutine is called 
register R0 will contain the 
address of a null-delimited string and the subroutine will simply print the 
string and return. You will of 
course need to utilize the TRAP routine out that prints a character. 

에 대한 문제가있다.

그래서이 나의 접근 방식이 내가이 올바른지 또는 내 논리가

PUTS:  
    ADD R2, R0, #0; 
    AND R0, R0, #0; 
    ADD R0, R2, #0; 

    Out(trapx21) ; print first char in r0; 


    BRp PUTS ; repeat loop 

맞다면 내가 정확히 어떤 도움이하고 있어요 경우 잘 모르겠어요 잘 모르겠어요입니까?

+0

putChar는 일반적으로 char 값을 직접 가져옵니다. 즉, 'r0'은 ASCII 값을 포함해야하지만'puts'는 char 포인터를 사용합니다. 즉,'r0'에는 메모리 주소가 포함됩니다. 따라서 포인터를 다른 레지스터에 복사하고 포인터를'r0'에로드하고 putChar를 수행하고 무한대로 반복하지 말고 string의 nul 터미네이터에 도달 할 때까지해야합니다. (LC3이나 트랩 API를 모르므로, 내 가정을 여러분의 문서와 비교해보십시오. 이것은 다른 플랫폼에서 일반적으로 어떻게 작동하는지에 대한 일반적인 조언입니다.) 현재 상태는 "15 % 완료되고 약간 꺼져 있습니다" 그러나 좋은 출발처럼 보인다. – Ped7g

+0

이제 어쨌든 몇 가지 사항을 변경 했습니까? @ Ped7g – rahulchawla

+0

디버거가있는 일종의 에뮬레이터/시뮬레이터가 있다면, 어셈블리를 배우고, 실험을 계속하고, 디버거에서 단일 스테핑 지시를 유지하고, 무슨 일이 일어나는지를 보는 가장 간단한 방법입니다. 위에서 쓴 것처럼 LC3에 대해서는 알지 못합니다. 편집 한 내용이 정확하지 않거나, 메모리로드 또는 포인터 업데이트 등을 닮지 않았으며, 임의 텍스트 (15 %에서 10 %로 완료되고 + 30 % 정크가 추가 된 것처럼 보임)처럼 보입니다. 추측하지 말고, 컴퓨터에서 원하는 것을 생각한 다음 쓰십시오. 그리고 디버그. – Ped7g

답변

1

트랩에 대한 몇 가지 문제가 있습니다.

  1. 가장 큰 실수는 함정 서비스 루틴에서 OUT 트랩을 사용하는 것입니다. 트랩이 호출되면 R7에 반송 주소가 입력됩니다. OUT 트랩에 전화를 걸면 R7이 파손됩니다. 이제는 처음부터 트랩이라고하는 코드로 돌아갈 방법이 없습니다.
  2. 전화가 왔을 때 다시 전화하려면 RET 명령이 필요합니다.
  3. 코드가 실제로 R0에 포함 된 문자열의 문자를 가져 오지 않습니다. 따라서 R0에 포함 된 주소 (LDR을 통해)를 읽으면 R0 + 1에 포함 된 주소에서 첫 번째 문자를 가져와 두 번째 문자를 가져와야합니다. R0의 주소에서 계속 문자를 읽어야합니다. NUL 터미네이터 인 0을 수신합니다.

문제의 지침과는 달리 MAIN을 작성하여 테스트해야합니다.

+0

고맙습니다. 귀하의 권장 사항에 맞지 않으니 고맙습니다. – rahulchawla