2012-01-06 2 views
0

다음 문제에 대한 도움을 바랍니다.어셈블리 : 다음 코드 및 일반적으로 메모리 스택에 값을 저장해야하는 이유

MIPS 어셈블리에서 n을 인수로 받고 큐브인지 확인하는 is_cube 함수를 구현하도록 요청 받았습니다. 예를 들어, 8 (2^3)과 1000 (10^3)은 큐브입니다. $sp이 과정의 모든 의해 스택에 $s0을 저장하지 않고,

# UNTITLED PROGRAM 

.data 

str: .asciiz "Please enter your number >" 
str1: .asciiz "The number is a cube" 
str2: .asciiz "The number is not a cube" 


.text 

main: 

    li $v0 4 
    la $a0 str 
    syscall 

    li $v0 5 
    syscall 


    move $t0 , $v0 
    li $t1, 0 
    blt $t0, $zero, negative 


    negative: 
    sub $t5, $zero, 1 
mul $t0, $t0, $t5 



is_cube: 

    addi $t1, $t1, 1 
    sgt $t2, $t1, $t0 
    bne $t2, $zero, There_is_not 
    mul $t3, $t1, $t1 
    mul $t4 ,$t3, $t1 
    beq $t4, $t0, There_is 

    jal is_cube 



There_is: 

    li $v0 4 
    la $a0 str1 
    syscall 

    jal end 

There_is_not: 

    li $v0 4 
    la $a0 str2 
    syscall 

    jal end 


end: 

하고 작동 :

나는 다음과 같은 코드를 썼습니다. 내 질문은 : 그것을 저장하지 않는 것이 맞습니까? 그렇다면 언제 사용해야합니까?

고마워요.

+0

나는 그 질문을 이해하지 못한다. 어디서나 $ s0을 사용하지 않고 있습니다 ... 왜 그걸 저장하겠습니까? – m0skit0

답변

1

함수를 구현하지 않았습니다. 정상적인 분기 명령어 대신 jal을 사용하는 루프를 구현했습니다. 실행은 주에서 시작하여 is_cube에서 시작하는 루프로 negative에서 시작하고 루프가 There_is 또는 There_is_not에서 종료 될 때 다른 분기 명령어 대신 jal end을 사용합니다.

이 코드 jal 명령어가 x86과 달리 프로그램 카운터의 현재 값을 스택으로 밀어 내지 않기 때문에 MIPS에서 작동하려면이 발생합니다.

숙제 인 경우이 코드를 제출하기 전에 어셈블러에서 함수 작성에 대한 메모로 돌아가십시오.

관련 문제