请教下面这段ARM汇编代码的注解
对下面这段代码的语句含义不是很清楚,另外对0,1 两处的调用会导致代码的流程怎样走?似乎没有X86的ret概念,希望熟悉的大侠指点一下。(本人刚学ARM不久,问题较初级)
IsrIRQ ;using I_ISPR register. sub sp,sp,#4 ;reserved for PC stmfd sp!,{r8-r9} ;IMPORTANT CAUTION ;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine. ldr r9,=I_ISPR ldr r9,[r9] mov r8,#0x0 0 movs r9,r9,lsr #1 bcs %F1 add r8,r8,#4 b %B0 1 ldr r9,=HandleADC add r9,r9,r8 ldr r9,[r9] str r9,[sp,#8] ldmfd sp!,{r8-r9,pc}
IsrIRQ ;using I_ISPR register. sub sp,sp,#4 ;reserved for PC ; 看来你的这个环境,这是中断处理函数,PC肯定被存在堆栈了,不过栈指针却得在这里移动,有些奇怪,不过既然是这样那就这样吧stmfd sp!,{r8-r9} ;保存用到的寄存器;IMPORTANT CAUTION ;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine. ldr r9,=I_ISPR ldr r9,[r9] ; 取存在I_ISPR位置的数mov r8,#0x0 0 movs r9,r9,lsr #1 ; 把上面取到的值的最低位移近C标志位bcs %F1 ; 如果该位是1,调到下面标记为"1"的地方add r8,r8,#4 ; 否则 r8 += 4b %B0 ; 跳到上面标记为"0"的地方1 ldr r9,=HandleADC add r9,r9,r8 ldr r9,[r9] ; r9 = *(int*) ((char *)r9 + r8)str r9,[sp,#8] ; 保存r9到堆栈,作为返回值ldmfd sp!,{r8-r9,pc} ; 返回