2012-03-29 3 views
1

Im은 다음 번 과제에 대한 기본 while 회 돌이 예를 만들려고 노력 중이며 무한 루프에 고정되어 있습니다. $ t3는 3에 도달하지 못하거나 3에서 그 값을 감지하지 못합니다. 여기서 내가 뭘 잘못하고 있니? 감사!while 루프 in MIPS

.data   #data segment 


msg1:.asciiz "please enter a number to convert to ASCI: " 
    nl:.asciiz "\n" 
msg2:.asciiz "done! " 



.text   # Code segment 
.globl main  # declare main to be global 
main: 

    la $a0,msg1  # $a0 := address of message 1 

    li $v0,4    # system call, type 4, print an string 
    syscall 

    li $t3,0 #initial value of $t3 


    li $v0,5 
    syscall #read an int 

loop: 

    la $a0,msg1  # $a0 := address of message 1 

    li $v0,4    # system call, type 4, print an string 
    syscall 


    addi $t3,$t3,1 

    beq $3,$t3,Exit # branch to the label Exit if $t3=3 

    j loop # branch unconditionally to loop ($t3 != 0) 

Exit: 
    li $v0,10  # System call, type 10, standard exit 
    syscall 

답변

1

문제는 여기에 있습니다 :

beq $3,$t3,Exit 

$3레지스터이다; 이 아니고 값이 3입니다. $3 레지스터의 내용을 참조하고 있습니다. 실제로는 $v1이며 아무 것도 넣지 않았기 때문에 값이 0입니다. 따라서 값 3과 비교하는 대신 0을 비교합니다. 실제로는 무한 루프가 아니기 때문에 $t3은 결국 0으로 랩되지만 생각을하게됩니다.

MIPS는 즉각적인 결과와 비교하면 값 3을 먼저 레지스터에로드해야합니다. 한 번만 값을로드해야하기 때문에

, 루프 전에이 줄을 추가

li $t4, 3 

을 변경하여이 비교 :

beq $t4, $t3, Exit 

이 루프의 당신을 얻을 것이다 . 그러면 프로그램은 msg1을 세 번 인쇄하고 종료합니다. 원하는 내용이 아닌 것으로 판단됩니다. 그러나이 작업을 마치면 계속 마무리 할 수 ​​있습니다.

+0

MIPS을 수행해야합니다 (가정은 0 각 루프 단위로 시작),'참조 slti'와'sltiu' – gusbro

+0

흥미 롭군요, 그걸 몰랐습니다. –

0

이 비교에 따라 레지스터를 즉시 및 분기와 비교하려면 slti과 분기 명령어 중 하나를 사용해야합니다. slti $t, $s, imm 명령은 $ s의 내용이 즉치보다 작 으면 $ t 레지스터를 1로 설정하고 그렇지 않으면 0으로 설정합니다. 3 같을 때 레지스터 $의 T3는

따라서, 분기하는 당신이 참으로 즉각적인와 비교하는 지침이 있는가

slti $a0, $t3, 3 # Sets $a0 to 1 if $t3 < 3, 0 otherwise 
    beq $a0, $0, loop # Jumps to 'loop' when $t3 < 0