2017-10-08 2 views
1

내 CS 클래스에 대한 MIPS 어셈블리 언어를 배우려고합니다. 나는 문법적으로이 프로그램을 쓰려고 애 쓰고있다. 교수님이 우리에게 준 다른 예를 보았습니다. 나는 그것을 철저히 따랐습니다. 내 지점에서 동일한 조건이 아니라는 오류가 나타납니다. 코드는 다음과 같습니다.MIPS bne 구문 분석기 오류

# Main program that will call subroutine fib to calculate the fibonacci and 
# print the result 
.text 
.globl main 
sub $sp,$sp,4 
sw $ra,0($sp) 

li $a0,3 
jal fib 
la $a0,str 
syscall 

sw $a0,0($v0) 
syscall 

lw $ra,0($sp) 
add $sp,$sp,4 
jr $ra 

.data 
str: 
    .asciiz "fib = " 

.text 
fib: 

sw $a1,0($a0) 
bne $a0,$0,1 # Branch if the argument is not equal to zero 
add $v0,$0   # If it is equal to 0,add 0 to the return value. 
addi $t0,$0,1 # Create temporary equal to 1. 
bne $a0,$t0,1  # Branch if argument is not equal to 1. 
addi $v0,1    # If it is,add one to the return value. 
addi $sp,$sp,-4  # Create space on the stack for the return value. 
sw $ra,0($sp)   # Save old return address to the stack 
addi $a0,-1 
jal fib    #jump to fib and save address 
addi $a0,$a1,-2  #subtract 2 from the starting number. 
jal fib 
lw $ra,0($sp) 
add $sp,$sp,4 
jr $ra 

나는 지금 당장이 코드가 제대로 작동하지 않는다는 것을 알고 있습니다. 그러나이 함수를 프로그래밍하는 데 도움을 요청하는 것이 아니므로 계속 실행하고 싶어서 어떤 일이 벌어지는 지 알 수 있습니다. 파일을로드하기 전에 다음 줄에 구문 오류가 발생합니다.

bne $a0,$0,1 # Branch if the argument is not equal to zero 

오류는 다음과 같습니다.

spim: (parser) syntax error on line 35 of file ... 
    bne $a0,$0,1 #Branch if the argument is not equal to zero 
     ^

모든 도움이 크게 감사하겠습니다! 정말 고맙습니다! 첫 번째 인수는, 귀하의 경우, 당신은 $a0$0 같지 않으면 분기 그것을 말하고있다 두 번째 인수와 동일하지 않은 경우

+0

방금 ​​테스트했습니다. 이, 나는 여전히 이전과 같은 오류가 발생합니다. –

답변

0

bne 세 번째 인수로 지정된 라벨로 분기됩니다,하지만 당신은 점프 할 레이블을 지정하지 않으면 bne의 마지막 인수는 으로 정의 된 레이블이고 소스 파일에이있는 경우 bne $t0, $0, 1은 무엇입니까 1은 무엇입니까? 또한 1은 유효한 라벨 이름이 아니며 레이블에는 문자, 숫자 및 밑줄 만 포함해야하며 글자로 시작해야하며 MIPS 명령어 세트의 특수 명령어가 될 수 없습니다

+0

나는 bne에게 점프하라고 알리는 레이블을 사용할 수 있다는 것을 알고 있지만, 나는 또한 마지막 인수를 줄 바꾸기로 사용할 수도 있다는 인상 아래에 있었다. MIPS에서 현재 라인을 읽었을 때 PC는 이미 다음 라인에있게 될 것이고, 그 후에는 한 공간 더 가고 싶다. 작동하지 않습니까? 이것이 실제로 가능한지 알려주십시오. –

+0

당신은 맞지만 마지막 인수는'bne' 바로 아래의 명령어 인'PC + 4'로부터 오프셋되어 있습니다. 마지막 인수는'bne'의 바이트 주소에 대해 ** not ** relative이고, 그래서이 경우'bne'이 참이면이 행'addi $ t0, $ 0,1'이 실행될 것입니다. 또한, 때로는 MIPS가 이상한데'sw $ t0, 0 ($ ra)'을 시도 할 때 오류가 발생했지만'$ ra, $ t0'로 변경하면 작동합니다. 그래서'bne'에서'1'을 라벨로 바꿔보고 작동하는지 확인하십시오. – Dummy

+0

좋아, 원래는 그 라인을 실행시키고 싶었습니다. 그러나, 나는 그것을 다른 방식으로 구현하기 시작했고 이제는 매력처럼 작동하는 레이블을 사용하고 있습니다. 나는 아직도 정확히 왜 그런지는 모르겠지만 적어도 그것이 효과가있다. 모든 도움을 주셔서 감사합니다! –