2017-12-03 13 views
1

안녕하세요 저는 교수님이 우리에게 남겨주고있는 몇 가지 예제 코드를 살펴 보았습니다. 일부 코드가 의미하는 바를 이해하는 데 몇 가지 문제가 있었지만 의견이 도움이되지 않습니다. 막연한. 첫 번째는 R3, R1,0; 라인의 끝을 확인해 보라, 내가 얻지 못하는 두 번째 것은 실제로 placeolnul의 시작 뒤에있는 논리이고, 마지막으로 이상하게 보이는 negeol의 .fill 값이지만 이유는 모르겠다. 당신이 정말로 그 문제들로 저를 도울 수 있다면 그것은 제가 코드를 훨씬 잘 이해하는 데 정말로 도움이 될 것입니다. 이에 관해서LC-3 명령 이해

.orig x3000 
    getstring: 
    lea r0,prompt ;get string prompt 
    puts 
    ld r1,negeol ;to test end of line 
    lea r2,rdbuff ;prep to read string 
    rdloop: 
    getc ;get string char 
    out 
    str r0,r2,0 ;store it 
    add r3,r1,r0 ;check for end of line 
    brz placeeolnul ;if so process 
    add r2,r2,1 ;ready for next char 
    br rdloop ;get it 
    placeeolnul: 
    and r0,r0,0 ;overwrite eol with 
    str r0,r2,0 ;nul 

    lea r1,rdbuff ;get address for len 
    jsr strlen ;get length 
    add r0,r0,0 ;if 0 
    brz quit ;then prog finished 
    trap xfc ;print length 
    lea r0,colon ;print colon 
    puts 
    lea r0,eol ;print lf 
    puts 
    br getstring ;go again 
    quit 
    halt 
    prompt: .stringz "Enter a string:" 
    eol: .fill x000d ; or x000a 
    .fill x0000 
    negeol: .fill xfff3 ; or xfff6 
    colon: .fill x003a 
    rdbuff .blkw 80 

    ; length subroutine 
    strlen: 
    and r0,r0,0 ;counter for length 
    st r2,saveX2 ;save regs used 
    st r3,saveX3 
    add r2,r1,0 ;copy of string addr 
    cloop: 
    ldr r3,r2,0 ;get char 
    brz exit ;check for nul 
    add r0,r0,1 ;incr counter 
    add r2,r2,1 ;go to next char 
    br cloop ;process it 
    exit: 
    ld r2,saveX2 ;restore used regs 
    ld r3,saveX3 
    ret 
    saveX2: .blkw 1 
    saveX3: .blkw 1 
    .end 

답변

0

:

add r3,r1,r0 ;check for end of line 

는 여기에서 그는 제로에서 분기 할 후속 "BRZ"에 대한 설정입니다.

brz placeeolnul ;if so process 

을 R1은 이미 사전이라는 것을 기억 :

그래서 우리는 레지스터 R1과 R0의 내용을 추가하고 R3가 0 인 경우, 우리는 다음 줄에 분기 있도록, R3에 그들을 가하고 있습니다

이 코드에 기초하여 값을로드 :

코드 별 태그 negeol의 값 (R1)을로드
ld r1,negeol ;to test end of line 

:

negeol 
    .fill xfff3 ; or xfff6 
,

이것은 EOL 문자의 칭찬을 추가하여 EOL 문자를 찾았는지 감지 할 수있는 빠른 방법입니다. 여기에는 아마도 xfff3입니다. 그것을위한 BRZ 문 및 로직 (당신의 두번째 질문)에 대해서는

: 추가가 0 인 경우 언급 한 바와 같이

brz placeeolnul ;if so process 

, 우리는 여기에서 분기되어있다. 우리가 (우리가 EOL 문자를 찾을 수 없습니다 의미) 분기하지 않는다면, 우리는 계속하지만 계속 본질적으로 다시 루프 태그 rdloop하는 것

add r2,r2,#1 ;ready for next char 
br rdloop ;get it 

우리는 BRZ 라인을 통해 이동하는 경우에, 그 수단을 이 부분에 질문이있는 경우에는

and r0,r0,#0 ;overwrite eol with 
str r0,r2,#0 ;nul 
.... etc... 

확실하지 : 그래서 그냥 우리가 문자열을 처리 할 수있는 코드로 우리를두고 placeeolnul하는 점프 .... 우리는 전체 문자열을 가지고, 우리는 그것을 처리 할 준비가 코드의

희망이 도움이됩니다.

제프