2013-11-04 1 views
0

필자는이 프로그램을 MIPS에서 작성하여 2로 나에게 주어진 힘을 계산하고 순차적 인 힘을 0으로 줄입니다. 예를 들어 아래 코드에서 $ a0에 4를 넣으면 그것은 (4^2) + (3^2) + (2^2) + (1^2)을 15로 계산해야합니다. 이것은 내가 지금까지 쓴MIPS의 반복 작성

main: 
addi $a0, $zero, 4 #put k in $a0 in this case 
addi $a1, $zero, 0 #put 0 in current sum 
addi $v1, $v1, 0  #tally the total in $v1 
for: 
lw $10, $a0   #load k into reg $10 
lw $11, $a1   #load sum into $11 
    addi $10, $10, -1  #subtracts 1 from k 
    li $9, 0    #sets i in for loop ($9) to 0 

이 무슨 짓입니다 :

li $v0, 10 
    syscall 

내가 MIPS에 새로 온 사람이 마무리에 많은 도움을 사용할 수 있습니다, 제가 루프를 사용하려는 알고 ,하지만 k에서 1을 뺀 값을 계산하는 동안 그것을 통과하는 방법을 모르겠습니다. 어떻게하면 2의 힘을 k의 힘으로 가져올 수 있겠습니까? mips에는 전력 작업이 없다고 생각하기 때문입니다. 과정의이 시점에서 나는 add, sub, and, 또는 slt, addi, j, beq, lw, sw 및 sll만을 사용할 수 있습니다. sub를 사용할 때 상수를 사용할 수 없습니까? 어떤 도움을 주셔서 감사합니다

답변

1

전력은 곱하기 곱셈은 합계입니다. 그래서 당신은 덧셈에 의한 곱셈을하는 함수와 곱셈에 의한 힘을주는 또 다른 함수를 작성할 수 있습니다. 예를 들어, 곱셈 기능 :

multiply: # $a0 first factor, $a1 second factor, $v0 result of multiplication 
    or $t0, $zr, $zr 
    or $t1, $a1, $a1 
    or $t3, $zr, $zr 
loop: 
    beq $t1, $zr, end 
    add $t0, $t0, $a0 
    addi $t1, $t1, -1 
    j loop 
    nop 
end: 
    or $v0, $t0, $0 
    jr $ra 
    nop 

(나는 이것을 테스트하지 않았습니다주의, 이것은 음수 작동하지 않습니다) 보조 노트로

, 당신은뿐만 아니라 MUL 명령을 가지고 있지만, 이미 봤는지 모르겠다.

0

강사가 당신에게 보여 주려는 개념은 실제로 sll에 2가 곱해진 것입니다. 이진수로 생각해야합니다. 예를 들어, 1부터 시작해 보겠습니다.

0000 0000 0000 0000 0000 0000 0000 0001 

'sll'은 무엇입니까? 0010 = 2. 다시 sll하면 0100 = 4가됩니다. 끝까지 이동하여 0x80000000을 가질 때까지 계속합니다.

"어떻게 2를 k의 힘으로 가져 오겠습니까?"라는 질문에 대한 대답은 생각보다 간단합니다. k로 1을 이동했습니다.

# $t0 contains 'k', the amount we want to shift by 
addi $t1, $zero, 1 
sllv $t3, $t1, $t0 

참고 : 당신이 변수 금액으로 전환 할 수 있음을 다시 한 번 확인했지만, this linksllv가 유효 말한다. 그러나 허용 된 기능 목록에 없으므로 sll $t1, $t1, 1을 반복해야합니다. (이동하려는 금액이 0 일 때를 대비해 루프 시작 부분에 수표를 넣어주십시오!)

+0

2의 거듭은 2를 곱하는 것과 같지 않습니다.) – m0skit0

+0

@ m0skit0 orly? 2 * 2 * 2 <> 2^3? – RobertB

+0

어이, 질문을 읽으십시오 : * "나는 (4^2) + (3^2) + (2^2) + (1^2)"를 계산하고 싶다. – m0skit0