求一个数的阶乘(64位结果)

ARM 142浏览

用ARM汇编语言实现20!,并将64位结果放在  R9:R8 中(R9中存放高32位)。

分析:64位结果的乘法指令通过两个32位的寄存器相乘,可以得到64位结果,在每次循环相乘中,我们可以将存放64位结果的两个

             32位寄存器分别与递增量相乘,最后将得到的高32位结果相加。

在ARM集成开发环境中具体实现代码:

; 使用的寄存器说明:
;                  R8:存放阶乘结果低32位
;                  R9:存放阶乘结果高32位
;                  R0:计数器
;                  R1:计算过程中暂存R9(R9值使用前会被覆盖)

    AREA Fctrl,CODE,READONLY     ; 声明程序代码段
    ENTRY                                              ; 程序入口
    CODE32                                           ; 声明32位ARM指令
START
    MOV         R8  ,  #20                         ; 低位初始化    
    MOV         R9  ,  #0                           ; 高位初始化
    SUB         R0  ,  R8  ,  #1                 ; 初始化计数器
Loop
    MOV         R1  ,  R9                          ; 暂存高位
    UMULL    R8  ,  R9  ,  R0  ,  R8     ; [R9:R8] = R0 * R8
    MLA          R9 , R1 , R0 , R9           ; R9 = R1 * R0 + R9
    SUBS       R0 , R0 , #1                    ; 计数器递减
    BNE          Loop                                ; 计数器不为0继续循环
Stop
    B Stop
    END                                                    ; 文件结束

程序执行后结果:

R8=0x82B40000

R9=0x21C3677C