2015-02-06 2 views
2

저는 ARM 어셈블리에서 시작하고 간단한 정수 나누기 서브 루틴을 작성하려고했습니다.ARM 정수 나누기 알고리즘

.text 
start: 
    mov r0, #25 
    mov r1, #5 
    bl divide 
    b stop 
divide: 
    cmp r0, r1 
    it lo 
    mov pc, lr 
    sub r0, r0, r1 
    add r2, r2, #1 
    b divide 
stop: 
    b stop 

가 나는 알고리즘에 대한 해낸 의사에 따라 쓴 :

Is the Divisor (bottom) larger than the Dividend (top)? 
Yes: 
    -Return the remainder and the counter(quotient) 
No: 
    -Subtract the Divisor from the Dividend 
    -Increment the counter by 1 
    -Repeat the method 

R0는 분자를 포함하고 R1은 분모가 포함되어 지금까지, 나는 다음 있습니다. 알고리즘이 끝나면 r0에는 나머지가 포함되고 r2에는 몫이 포함되어야합니다. 그러나 실행 중에 r0은 19를 포함하고 r2는 0을 포함합니다.

제가 놓친 논리에 오류가 있습니까?

+1

ARM 또는 Thumb으로 어셈블됩니까? 어느 쪽이든 난처한 점이있어서 놀랍다. 'it' 명령어 다음의 명령어도 상응하는 조건 코드를 가지고 있지 않으면 어셈블러가 에러를 내야한다. ('it' 자체는 ARM에서 어셈블하지 않는다. 상태). 'mov pc, lr'가 무조건 실행될 때 무슨 일이 일어나는 지 생각해보십시오. (내 심령 력은 시뮬레이터/디버거가 레지스터를 16 진수로 표시한다고 알려줍니다.) – Notlikethat

+0

감사합니다. 나는 movlo를 movlo로 바꿨고 효과가 있었다. – watswat5

답변

1

it lo을 삭제했으며 movmovlo으로 변경하여 정상적으로 작동했습니다.