Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]

[PC SPIM] 피보나치

2010. 12. 4. 12:11programming/architecture

728x90
어셈블리 구문
 # 코드는 서브루틴으로 재귀적으로 숫자를 계산 피보나치 수
  • # Uses system stack # 사용 시스템 스택
  • . data . 데이터
  • in_string: .asciiz "Input a positive integer:\n\n" in_string :. asciiz "정수 입력 긍정합니다 : \ n \ N"이
  • out_string: .asciiz "The Fibonacci number is:\n\n" out_string :. asciiz은 "피보나치 번호는 같습니다 : \ n \ N"이
  • .text . 텍스트
  • main: 주 :
  • # print out prompt 아웃 프롬프트에서 인쇄 #
  • li $v0, 4 # system call code for printing string = 4 리 $ v0, 4 #에 대한 인쇄 문자열 코드 시스템 호출 = 4
  • la $a0, in_string # load address of string to be printed into $a0 라 달러 a0, 문자열의 부하 주소 # in_string a0 $로 인쇄되어야
  • syscall # call operating system to perform print operation 호출에 #이 작업을 수행할 인쇄하는 시스템을 호출 운영
  • # read integer into $s0 # s0 읽기 정수로 달러를
  • li $v0, 5 # system call code for read integer = 5 5 # 시스템 호출 코드를 읽어 정수 v0 리튬 $ = 5
  • syscall # call operating system 호출에 # 운영 체제 호출
  • move $s0, $v0 # value read from keyboard returned in register $v0 ; transfer to $s0 s0 레지스터 $ v0; 전송을 달러로 반환 키보드에서 읽을 가치를 v0 # $, $ s0 이동
  • sw $s0, ( $sp ) # push argument for Fib on stack 스택 자상한 달러 s0, ($ SP에)에 심실에 대한 인수를 추진 #
  • addi $sp,$sp, -4 # and decrement stack pointer addi $ SP에, $ SP에, -4 #와 감소는 스택 포인터
  • jal Fib # jump to subroutine 일본 항공 심실 # 점프가 서브루틴에
  • addi $sp,$sp, 4 # increment stack pointer addi $ SP는, $ SP에, 4 # 스택 포인터가 증가
  • lw $s1, ( $sp ) # and pop result from stack 스택 SP에) # 및 POP 결과에서 달러 s1, ($ lw
  • # print out prompt 아웃 프롬프트에서 인쇄 #
  • li $v0, 4 # system call code for printing string = 4 리 $ v0, 4 #에 대한 인쇄 문자열 코드 시스템 호출 = 4
  • la $a0, out_string # load address of string to be printed into $a0 라 달러 a0, 문자열의 부하 주소 # out_string a0 $로 인쇄되어야
  • syscall # call operating system 호출에 # 운영 체제 호출
  • # print out result ( stored in $s1 ) 밖으로 결과 인쇄 # (s1 $에 저장)
  • li $v0, 1 # system call code for printing integer = 1 리 $ v0, 1 # 시스템 호출 코드를 정수에 대한 인쇄 = 1
  • move $a0, $s1 # move integer to be printed into $a0: $a0 = $s1 빨리 달러를 a0 $ s1 # 이동 정수는 a0 $로 인쇄되어야 : $ a0 = $ s1
  • syscall # call operating system to perform print # 호출에 인쇄를 수행할 운영 체제 호출
  • # exit program # 종료 프로그램
  • li $v0, 10 # system call code for exit = 10 v0, 10 # 시스템 호출 코드 출구 $ 리 = 10
  • syscall # call operating system 호출에 # 운영 체제 호출
  • # blank line at end to keep SPIM happy! 라인의 끝에 공백 # 행복 SPIM가 계속!
  • ################################################################################## ################################################## ################################
  • # Fibonacci subroutine # 피보나치 서브루틴을
  • # input: integer n, on stack # 입력 : 정수 없음에 스택
  • # output: Fib ( n ) , nth Fibonacci number # 출력 : 심실 (n)이, 번째 피보나치 번호
  • # description: recursively computes Fib ( n ) = Fib ( n -1 ) + Fib ( n -2 ) , Fib ( 0 ) = 0 , Fib ( 1 ) = 1 . # 설명 : 재귀적으로 계산 심실 (n)이 = 사소한 거짓말 (없음 -1) + 심실 (없음 -2), 심실 (0) = 0, 사소한 거짓말 (1) = 1.
  • # uses : $t0, $t1 #에서 사용하는 : $ t0, $를 T1에서
  • ################################################################################## ################################################## ################################
  • Fib: 심실 :
  • # procedure prologue : # 프로 시저 프롤로그 :
  • sw $ra, ( $sp ) # save return address on stack , since recursive, , 반송 주소를 스택, 이후 재귀 $ SP에 저장) $ (#가, 라를 자상한
  • addi $sp,$sp, -4 # and decrement stack pointer addi $ SP에, $ SP에, -4 #와 감소는 스택 포인터
  • sw $fp, ( $sp ) # save previous frame pointer on stack 스택) #하기 이전 프레임 포인터에 SP $ FP가을 ($ 자상한
  • addi $sp,$sp, -4 # and decrement stack pointer addi $ SP에, $ SP에, -4 #와 감소는 스택 포인터
  • add $fp,$sp, 12 # set frame pointer to point at base of stack frame 프레임을 추가 $ FP가를 $ SP에 12 기지의 스택에 프레임 포인터를 가리 키도록 설정 #
  • lw $t0, ( $fp ) # copy argument to $t0: $t0 = n n을 $ FP가) # 복사 인자로 $ t0 : $ t0 = (t0, lw 달러
  • bge $t0, 2 ,do_recurse # if argument n >= 2 , branch to recursive sequence do_recurse t0, 2, 달러 bge #면 인자 없음> = 2, 순서 재귀 지점
  • beq $t0, 0 , base_0 # if n = 0 , jump to base_0 $ t0, 0, base_0 # 경우에 없음 = 0, 점프 base_0 beq
  • beq $t0, 1 , base_1 # if n = 1 , jump to base_1 $ t0, 1, base_1 # 경우에 n은 1, 점프 base_1 beq
  • base_0: base_0 :
  • li $t0, 0 # else set result to 0 리 달러가 t0, 0 0 #으로 결과를 설정한 다른
  • b epilogue # branch to end B 조 에필로그 # 분기 종료
  • base_1: base_1 :
  • li $t0, 1 # else set result to 1 리 달러가 t0, 1 #로 결과를 다른 설정
  • b epilogue # branch to end B 조 에필로그 # 분기 종료
  • do_recurse: addi $t0,$t0, -1 # $t0 = n -1 do_recurse : addi $ t0, $ t0, -1 # $ t0 = 없음 -1
  • sw $t0, ( $sp ) # push argument n -1 on stack 스택 SP에) # 푸시 인수 없음 -1에 $ t0, ($을 자상한
  • addi $sp,$sp, -4 # and decrement stack pointer addi $ SP에, $ SP에, -4 #와 감소는 스택 포인터
  • jal Fib # call Fibonacci with argument n -1 일본 항공 악의없는 거짓말은 # -1 없음 인수 전화 피보나치 같이
  • # leave result on stack for now # 지금은 스택에두고 결과를
  • lw $t0, ( $fp ) # re-copy argument to $t0: $t0 = n n을 $ FP가) # 다시 복사 인자로 $ t0 : $ t0 = (t0, lw 달러
  • addi $t0,$t0, -2 # $t0 = n -2 addi $ t0, $ t0, -2 # $ t0 = 없음 -2
  • sw $t0, ( $sp ) # push argument n -2 on stack 스택 SP에) # 푸시 인수 n을 -2에 $ t0, ($을 자상한
  • addi $sp,$sp, -4 # and decrement stack pointer addi $ SP에, $ SP에, -4 #와 감소는 스택 포인터
  • jal Fib # call Fibonacci with argument n -2 일본 항공 악의없는 거짓말은 # -2 없음 인수 전화 피보나치 같이
  • addi $sp,$sp, 4 # increment stack pointer addi $ SP는, $ SP에, 4 # 스택 포인터가 증가
  • lw $t0, ( $sp ) # and pop result of Fib ( n -2 ) from stack into $t0 ) lw $를 t0, ($ SP에 #과 심실 결과 (없음 -2)부터 t0 $ 스택으로
  • addi $sp,$sp, 4 # increment stack pointer addi $ SP는, $ SP에, 4 # 스택 포인터가 증가
  • lw $t1, ( $sp ) # and pop result of Fib ( n -1 ) from stack into $t1 ) lw $를 T1에서, ($ SP에 #과 심실 결과 (없음 -1)에서 T1에서 $ 스택으로
  • add $t0,$t0,$t1 # $t0 = Fib ( n -2 ) + Fib ( n -1 ) ; have result 결과를 $ t0, $ T1에서 # $ t0 = 사소한 거짓말 (없음 -2) + 악의없는 거짓말이 (없음 -1);있다 t0 $를 추가합니다
  • epilogue : # procedure epilogue : $t0 holds result 에필로그가 : # 프로 시저 에필로그 : $ t0 결과를 보유하고
  • addi $sp,$sp, 4 # increment stack pointer addi $ SP는, $ SP에, 4 # 스택 포인터가 증가
  • lw $fp, ( $sp ) # and pop saved frame pointer into $fp $ FP가, ($ SP에) # lw FP가 달러를 포인터로 저장 프레임
  • addi $sp,$sp, 4 # increment stack pointer addi $ SP는, $ SP에, 4 # 스택 포인터가 증가
  • lw $ra, ( $sp ) # and pop return address into $ra 라스을 ($ SP에) # 및 POP 반송 주소에 $ $ lw 라
  • addi $sp,$sp, 4 # increment stack pointer addi $ SP는, $ SP에, 4 # 스택 포인터가 증가
  • # to pop argument ( n ) from stack ( discard ) #)을 삭제하 팝업 인자 ((스택 n)이에서
  • sw $t0, ( $sp ) # push result onto stack 스택 ($ SP에) # 푸시 결과로, t0 달러 자상한
  • addi $sp,$sp, -4 # and decrement stack pointer addi $ SP에, $ SP에, -4 #와 감소는 스택 포인터
  • jr $ra # return to caller 호출자에게 주니어 $ 라 # 반환
  • ################################################################################## ################################################## ################################
  • # end of Fibonacci 피보 나찌의 #
  • ################################################################################## ################################################## ################################
  • 728x90