Recursion ARM程序集-阶乘递归程序计数器超出有效内存范围

Recursion ARM程序集-阶乘递归程序计数器超出有效内存范围,recursion,assembly,arm,factorial,program-counter,Recursion,Assembly,Arm,Factorial,Program Counter,您好,我对编写汇编非常陌生,对于我试图编写递归函数来计算n的阶乘,我有一个问题 下面是我编写阶乘函数的尝试: .global main main: MOV r1, #3 fact: SUB sp, sp, #8 STR lr, [sp, #0] STR r1, [sp,#4] CMP r1, #1 BGT Else ADD sp, s

您好,我对编写汇编非常陌生,对于我试图编写递归函数来计算n的阶乘,我有一个问题

下面是我编写阶乘函数的尝试:

            .global main

main:
    MOV r1, #3

fact:
    SUB sp, sp, #8      
    STR lr, [sp, #0]    
    STR r1, [sp,#4]     

    CMP r1, #1          
    BGT Else            


    ADD sp, sp, #8      

    MOV pc, lr 

Else: 
    SUB r1, r1, #1      
    BL fact             
    MOV r2, r1
    LDR r1, [sp, #4]    
    LDR lr, [sp, #0]    
    ADD sp, sp, #8      
    MUL r1, r2, r1      
    MOV pc, lr 

    MOV r0, #1
    SWI 0x6b        
    SWI 0x11        
问题是:我可以成功地计算出3的阶乘是6,并在程序结束时将其存储在r1中;然而,在循环的第三次执行中,我永远无法通过最后一个“MOV pc,lr”语句,我无法理解为什么


当我进入MOV pc的第三个循环时,lr出现一个错误,指出:“pc超出有效内存范围”,但我不确定为什么会出现这种情况。任何指向正确方向的指针都将非常感谢,因为我是一个绝对的初学者,无法理解为什么会发生这种错误。谢谢你抽出时间

您在什么环境下运行此功能?你确定你可以从
main
返回吗?@Jester我在Arm-Sim上运行这个,抱歉应该提到这个。老实说,我不太确定你在问什么,你能详细说明一下吗?
lr
在开始时是否有效-在某些环境下,你必须使用退出系统调用,不能直接返回。PS:你知道你的最后三行永远不会到达,对吗?@Jester是的,我知道最后三行没有到达,程序在第三次MOV pc,lr执行后由于错误而停止。我非常确定lr在开始时是有效的,在ARM Sim卡中,我可以逐步执行每个步骤,直到第三次调用MOV pc,lr为止。你知道为什么吗?对不起,如果我没有真正正确地解释您的问题,我在这里确实是一个绝对的初学者,不能完全理解您的问题。如果您将
MOV pc,lr
放在
main:
(要执行的第一条代码指令)之后,它是否按预期工作?(完全退出程序,不做其他事情)这就是Jester的要求。