2013-11-27 5 views
0

간단한 반복 예/아니오 반복문 입력을 읽지 않고 반복 또는 끝내기로 결정하는 이유를 모르겠습니다. 여기 내 코드가 도움이 될 것입니다!MIPS 어셈블리 (MARS)

.data 
again: 
    .asciiz "Again (y or n)? " 
answer: 
    .asciiz " " 

.text 
.globl main 
    main: 
    li $v0, 4 
    la $a0, again 
    syscall 

    la $s4, answer 
    jal get 

    beq $v0, 'y', main 
    beq $v0, 'Y', main 

    li $v0, 10 
    syscall 

    get: 
    li $v0, 12 
    li  $a1, 2 
    syscall 
    jr $ra 
+0

MARS에 익숙하지 않지만 'sw $ v0, ($ s4)'는 $ v0에 실제로 문자가 포함되고 _pointer_가 아닌 문자가 포함되어 있습니까? 나는 당신이'대답'에 그 캐릭터를 저장하기 위해'LB' /'SB'를 할 필요가 있다고 생각합니다. –

+0

sw $ v0, ($ s4) ==> 단어 저장 : 유효 단어 메모리 주소에 $ v0 내용 저장 – user2989270

+0

예,하지만 실제로 '답변'에 입력 된 'Y'에 _pointer_를 저장 하시겠습니까? 나중에 캐릭터로 읽으려고하는 것 같습니다. syscall'read string'이 첫 번째 문자의 값이 아니라 문자열에 대한 포인터를 반환한다고 가정합니다. –

답변

3

이것을 고려 :

.data 
again: 
    .asciiz "Again (y or n)? " 
answer: 
    .space 256 

.text 
.globl main 
    main: 
    li $v0, 4 
    la $a0, again 
    syscall 

    la $a0, answer 
    li $a1, 3 
    li $v0, 8 
    syscall 

    lb $t4, 0($a0) 

    beq $t4, 'y', main 
    beq $t4, 'Y', main 

    li $v0, 10 
    syscall 

첫째, 코드에서, 당신은 그들이 기능 (some docs here)와 상호 작용한다고하여 콜이 작동 방식과 오해 것 같다. 루틴을 얻는 루틴은 기본적으로 시스템 콜이라고 불렀기 때문에, 기본적인 것을 아마 줄이는 것이 아니라 복잡성을 추가하는 루틴을 추가하는 것으로 꺼 냈습니다.

다음으로 입력 버퍼링 방식에 대한 오해가 코드의 주된 문제입니다. 코드에서 answer에 정확히 2 바이트의 공간을 할당 한 다음 syscalls를 사용하여 한 번에 2 바이트를 초과하지 않도록합니다. 대부분의 시스템에서 stdin에 대해서는 작동하지 않으므로 stdin은 줄 버퍼이며 이는 사용자가 스트림을 플러시하기 위해 ENTER을 눌러야 함을 의미합니다. 즉, 사용자가 'y'을 입력하면 syscall은 실제로 "y\n\0"을 반환합니다.

이 문제를 해결하기 위해 syscall을 3 자로 읽고 최대 256 개의 응답을 저장하도록 확장했습니다. 어떤 크기에서도 안전하도록 확장하는 것은 독자에게 맡기는 편이 낫습니다.

+0

설명해 주셔서 감사합니다. – user2989270

+0

나는 내 수정 된 코드 ^로 그것을 어떻게 수행하는지 알아 냈다고 생각한다. 등록 내용과 주소가 섞여 있다고 생각하십시오. – user2989270