티스토리 뷰

sub writes back the result of the subtraction to the destination operand. That is not what you want here - you just want to do a comparision, so you should use cmp:

cmp r1, r4  -- cmp always updates the flags, so you don't need to write cmps
bne loop    

그러나 코드 n는 0 또는 1 인 경우를 처리하지 않습니다 . 또한 r1에 완벽하게 적합한 카운터가 이미있는 경우 추가 카운터 ( ) 를 사용할 필요가 없습니다 r0. 따라서 다음과 같이 다시 작성할 수 있습니다.

mov r3, #1  -- default value
loop:
  cmp r0, #1
    -- if (n > 1) { r3 *= n; n--; goto loop; }
      mulgt r3, r0, r3
        subgt r0, r0, #1
          bgt loop
          
-------------------

이 멋진 게시물을 읽으십시오 .

참고로, 적절한 컨텍스트 전환을 보장하기 위해 ARM 의 ARM 호출 규칙을 따르지 않는다는 점에 유의하십시오 .

너무 많은 레지스터를 사용하고 있다고 생각하므로 그 수를 줄이십시오. 코드 흐름을 추적하고 디버그하는 것이 더 쉬울 것입니다.

마지막 제안은 다음과 같습니다.

mov r3, #1
cmp r0, #0
beq end

factorial:
    mul r3, r3, r0
        sub r0, r0, #1 
            beg factorial 
            end:              
                mov r0, r3
                

나는 당신의 솔루션에서 당신이 변경해야한다고 생각합니다.

subs r1, r4  -- check if counter = the initial r0

으로

cmp r1, r4  -- check if counter = the initial r0

따라서 r1 > r4변경하지 않고 확인 r1하고 그렇지 않으면 한 루프 후에 종료됩니다.



출처
https://stackoverflow.com/questions/39970013
댓글
공지사항
Total
Today
Yesterday
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30