티스토리 뷰
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