diff --git a/audio/rate_arm_asm.s b/audio/rate_arm_asm.s
index a727209..3e39b13 100644
--- a/audio/rate_arm_asm.s
+++ b/audio/rate_arm_asm.s
@@ -222,8 +222,8 @@ SimpleRate_M_read:
         @ Calling back into C++ here. WinCE is fairly easy about such things
         @ but other OS are more awkward. r9 is preserved for Symbian, and
         @ we have 3+8+5 = 16 things on the stack (an even number).
-        MOV     r14,PC
-        LDR     PC,[r13,#24]            @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
+        LDR     r5,[r13,#24]
+        BLX     r5                      @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
         SUBS    r1, r0, #1              @ r1 = inLen-1
         LDMFD   r13!,{r0,r2-r3,r12,r14}
         BLT     SimpleRate_M_end
@@ -301,8 +301,8 @@ SimpleRate_S_read:
         @ Calling back into C++ here. WinCE is fairly easy about such things
         @ but other OS are more awkward. r9 is preserved for Symbian, and
         @ we have 3+8+5 = 16 things on the stack (an even number).
-        MOV     r14,PC
-        LDR     PC,[r13,#24]            @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
+        LDR     r5,[r13,#24]
+        BLX     r5                      @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
         SUBS    r1, r0, #2              @ r1 = inLen-2
         LDMFD   r13!,{r0,r2-r3,r12,r14}
         BLT     SimpleRate_S_end
@@ -381,8 +381,8 @@ SimpleRate_R_read:
         @ Calling back into C++ here. WinCE is fairly easy about such things
         @ but other OS are more awkward. r9 is preserved for Symbian, and
         @ we have 3+8+5 = 16 things on the stack (an even number).
-        MOV     r14,PC
-        LDR     PC,[r13,#24]            @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
+        LDR     r5,[r13,#24]
+        BLX     r5                      @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
         SUBS    r1, r0, #2              @ r1 = inLen-2
         LDMFD   r13!,{r0,r2-r3,r12,r14}
         BLT     SimpleRate_R_end
@@ -478,8 +478,8 @@ LinearRate_M_read:
         @ Calling back into C++ here. WinCE is fairly easy about such things
         @ but other OS are more awkward. r9 is preserved for Symbian, and
         @ we have 2+9+5 = 16 things on the stack (an even number).
-        MOV     r14,PC
-        LDR     PC,[r13,#24]            @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
+        LDR     r5,[r13,#24]
+        BLX     r5                      @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
         SUBS    r1, r0, #1              @ r1 = inLen-1
         LDMFD   r13!,{r0,r2-r3,r12,r14}
         BLT     LinearRate_M_end
@@ -581,8 +581,8 @@ LinearRate_S_read:
         @ Calling back into C++ here. WinCE is fairly easy about such things
         @ but other OS are more awkward. r9 is preserved for Symbian, and
         @ we have 2+9+5 = 16 things on the stack (an even number).
-        MOV     r14,PC
-        LDR     PC,[r13,#24]            @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
+        LDR     r5,[r13,#24]
+        BLX     r5                      @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
         SUBS    r1, r0, #2              @ r1 = inLen-2
         LDMFD   r13!,{r0,r2-r3,r12,r14}
         BLT     LinearRate_S_end
@@ -684,8 +684,8 @@ LinearRate_R_read:
         @ Calling back into C++ here. WinCE is fairly easy about such things
         @ but other OS are more awkward. r9 is preserved for Symbian, and
         @ we have 2+9+5 = 16 things on the stack (an even number).
-        MOV     r14,PC
-        LDR     PC,[r13,#24]            @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
+        LDR     r5,[r13,#24]
+        BLX     r5                      @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
         SUBS    r1, r0, #2              @ r1 = inLen-2
         LDMFD   r13!,{r0,r2-r3,r12,r14}
         BLT     LinearRate_R_end
