2014-12-16 5 views
0

그래서 문자열을 저장하는 방식이 효과가 있다고 생각합니다. 난 그냥 문자열을 서브 루틴 밖으로 전달하는 몇 가지 문제가 있습니다. "반환하는 개념 내가 서브 루틴의 무언가를 전달하기 위해 당신이 R1에 저장해야한다는 것을 들었지만 나는 내 WORD 배열LC3에서 서브 루틴이있는 문자열에서 읽는 데 문제가 있습니다

.orig x3000 
    AND  R1,R1,0 
    LEA  R0,PROMPT 
    PUTS 

    JSR  GETS 
    ST  R1,WORD 

    LEA  R0,WORD 
    PUTS 

    halt 

; ---------Data Area------------- 
WORD .blkw 20 
PROMPT .stringz "Enter String: " 
; -------------------------------  

GETS LEA R1,MEMORYBLOCK ; saves the address of the storage memory block 
loop GETC    ; input character -> r0 
    PUTC    ; r0 -> console 
         ; always points at the next available block 

    LD  R2,EMPTY ; check for 
    ADD  R2,R2,R0 ; end of line 
    BRz  finish 

    LD  R2,COUNTDOWN 
    ADD  R2,R2,#-1 
    BRz  finish 
    ST  R2,COUNTDOWN 

    STR  R0,R1,#0  ; r0 -> (memory address stored in r1 + 0) 
    ADD  R1,R1,#1  ; increments the memory pointer so that it 
    BR  loop 

finish LEA  R1,MEMORYBLOCK 
    RET 


; ----Subroutine Data Area------- 
EMPTY  .fill xfff6 
COUNTDOWN .fill #10 
MEMORYBLOCK .BLKW 20 
; ------------------------------- 

.end 

답변

0

여기에 가장 큰 문제로 저장할 얻을 수있다 끈". GETS가 끝날 때 실제로하는 일은 문자열이 시작되는 메모리 주소를 반환하는 것입니다. 이를 호출 함수의 WORD에 저장하면 입력 한 문자열의 첫 번째 바이트 (즉, MEMORYBLOCK의 메모리 주소)의 메모리 주소를 WORD의 첫 번째 바이트에 저장합니다. MEMORYBLOCK에서 WORD로 전체 문자열을 복사하지 않습니다.

가장 쉬운 "수정"어떻게 당신이하려는 것은 변화하는 것에 대한

LEA  R0,WORD 

다음

LD  R0,WORD 

및 좋은 측정을위한

에 :

WORD .blkw 20 

WORD .fill 0 

이제는 단일 값 (예 : MEMORYBLOCK의 메모리 주소).

그러나이 시점에서 문자열의 사본을 만들지 않았습니다. 이렇게하려면 루프를 만들어 MEMORYBLOCK을 거쳐 각 바이트를 WORD로 복사해야합니다.

이 작업을 수행하는 마지막 더 값싼 방법은 호출 기능에서 MEMORYBLOCK을 직접 사용하는 것입니다. 달리 요구하는 프로젝트 요구 사항이없는 한,이 크기의 프로그램에서는별로 유효하지 않습니다.