2017-11-17 2 views
2

숫자 n을 입력 한 다음 n 개의 입력을 요청하고이를 모두 다른 주소에 저장하여 실행 지침으로 읽을 수 있도록 코드를 작성하려고합니다.LMC (little-man-computer)의 다른 주소에 알 수없는 입력 개수를 저장하려면 어떻게해야합니까?

그러나 n 개의 다른 입력란에 n 개의 입력을 저장하는 방법을 모르므로 저는 막혔습니다. 지금까지 입력 n을 요청한 다음 n 입력을 요청할 수 있지만 모두 동일한 주소에 저장됩니다. 당신이 다른 메모리 주소로 할 때마다 가리 키도록 STO 명령을 업데이트하는 자체 수정 코드를 사용할 필요가 LMC와

IN 
    STO  N 

loopTop 
    IN 
    STO NBS 
    LDA N 
    SUB ONE 
    STO N 
    BRZ done 
    BR loopTop 

done  

    OUT 
    HLT 

ONE 
    DAT 001 
N 
    DAT 000 
NBS 
    DAT 000 
+0

N의 상한선이 적당히 작은 경우 프로그램에서 해당 메모리 양을 예약 할 수 있습니다. 그렇지 않으면 우리는 일반적으로 운영 체제를 호출하여 필요할 때 더 많은 메모리를 요청해야합니다. 환경에서 어떻게 작동하는지 모릅니다. –

+0

LMC에는 간접 참조를위한 포인터 (즉, 레지스터에 저장된 주소 또는 메모리에 저장된 주소)를 사용할 수있는 방법이 있습니까? 그렇다면 그렇게하십시오. 루프에서 포인터를 증가시킵니다. –

+0

와우, 루프의 모든로드/저장 명령에서 주소를 수정해야한다는 것은 불편합니다. 하지만 그래도 충분하게 프로그래밍 할 수 있습니다. –

답변

0

:

여기 내 코드입니다. 메모리 위치에 값을 하나 추가하여 저장 될 값이 매번 이전 루프보다 하나 더 높은 위치에있게합니다.

 IN   ; Accumulator = number of values to read (N) 
LOOP BRZ PRG ; If Accumulator (N) is 0 we are finished - execute program at PRG 
     SUB ONE 
     STO N  ; N=N-1 
     IN   ; Get value 
ST  STO PRG ; Store it in the program starting at PRG (this changes every loop) 
     LDA ST  ; Get current store command (ST) 
     ADD ONE ; add one to store command to increment memory location 
     STO ST  ; Update store command (ST) 
     LDA N  ; Put current value of N in accumulator 
     BRA LOOP ; Continue loop 
N  DAT 0  ; Number of values to read 
ONE  DAT 1  ; Value 1 
PRG  DAT 0  ; We will store all of the values from this point onward 
+1

저의 초기 생각은 저와 같은 매장 가치를 늘려야한다는 것이 었습니다.하지만 어떻게 할 수 없었습니다. 당신의 도움을 주셔서 대단히 감사합니다! –

관련 문제