2016-06-04 2 views
1

mips 어셈블리를 사용하려고하는데 분기 메커니즘에 문제가 있습니다. 내 코드의이 "짧은"부분에서 오류가있는 곳입니다 (필자는 생각합니다). 필자가 입력하는 숫자는 중요하지 않으며 항상 func1로 점프합니다. 누군가 나를 도울 수 있습니까? 감사합니다.어셈블리 밉 분기 오류

코드 :

.text 
.globl main 

main: 
.data 
param: .float 0 
val_1: .float 1 
val_2: .float 2 
val_3: .float 3 
texto: .asciiz "type 1 for func 1, 2 for func 2 and 3 for func 3: \n" 

.text 

la $a0, texto  #print 
li $v0, 4 
syscall 
li $v0, 6   #read 
syscall 
la $t0, ($v0)  #from $v0 to $t0 

beq $t0, 1, func1  #branch for func1 
beq $t0, 2, func2  #branch for func2 
beq $t0, 3, func3  #branch for func3 
j end 
+0

'$ v0 == 6'이 (가)'syscall '이'read_float' 인 경우 왜'($ v0)'가 유효한 주소로 설정 되길 기대합니까? – EOF

+0

어떻게해야할까요?'la $ t0, ($ v0)'? 옵션이 1, 2, 3 (모두 정수) 인 경우 syscall 6 ('read_float')을 사용하는 이유는 무엇입니까? – Michael

+0

정확히 그 오류입니다. 고맙습니다! –

답변

0

당신은 정수를 읽어 li $v0, 5를 사용해야합니다. 당신이 원하는 것을하는 예제가 있습니다.

.text 
.globl main 

main: 
.data 
param: .float 0 
val_1: .float 1 
val_2: .float 2 
val_3: .float 3 
texto: .asciiz "type 1 for func 1, 2 for func 2 and 3 for func 3: \n" 
texto2: .asciiz "option 1 chosen \n" 
texto3: .asciiz "option 2 chosen \n" 
texto4: .asciiz "option 3 chosen \n" 
.text 

la $a0, texto  #print 
li $v0, 4 
syscall 
li $v0, 5   #read 
syscall 
la $t0, ($v0)  #from $v0 to $t0 

beq $t0, 1, func1  #branch for func1 
beq $t0, 2, func2  #branch for func2 
beq $t0, 3, func3  #branch for func3 
j end 


func1: 
    la $a0, texto2  #print 
    li $v0,4  # syscall with v0 = 11 will print out 
    syscall   # one byte from a0 to the Run I/O window 
    j end 

func2: 
    la $a0, texto3  #print 
    li $v0,4  # syscall with v0 = 11 will print out 
    syscall   # one byte from a0 to the Run I/O window 
    j end 

func3: 
    la $a0, texto4  #print 
    li $v0,4  # syscall with v0 = 11 will print out 
    syscall   # one byte from a0 to the Run I/O window 
    j end 
end: 
    li $v0,10 
    syscall