实验一:通过STMFD/LDMFD,MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算Xn的值。 具体实验程序如下: ;*************************************************** ;本程序用于计算x 的n 次方,程序中定义为9 的8 次方 ;SP->R13,堆栈指针 ;LR->R14,执行跳转指令后PC值会自动保存到LR中 C->R15,直接向其写入地址值即可实现在4GB空间的任意跳转 ;*************************************************** x equ 3 n equ 4 area example,code,readonly entry code32 start ldr sp,=0x40003f00 ldr r0,=x ldr r1,=n bl pow ;pc=0x4000000c halt b halt ;pc=0x40000010 pow stmfd sp!,{r1-r12,lr} ;STMFD为满地址减堆栈 ;执行后SP=0x40003f00-13*4=0x40003ecc ;保护现场,即r1-r12,lr movs r2,r1 ;if r2=0 then z=1 ;else z=0 ;程序中r2=r1=n=3,z=0 moveq r0,#1 ;if z=1 then r0=1 ;else r0=r0 ;程序中z=0,故r0值不变 beq pow_end ;if z=1 then 跳转 ;else 往下执行 ;程序中z=0,则往下执行 mov r1,r0 sub r2,r2,#1 pow_l1 bl do_mul ;调用乘法子函数 subs r2,r2,#1 bne pow_l1 pow_end ldmfd sp!,{r1-r12,pc} ;LDMFD为满地址减堆栈 ;执行后SP=0x40003f00 ;恢复现场,即r1-r12,pc do_mul mul r0,r1,r0;r0=r1*r0 mov pc,lr ;返回跳转时下一条要执行的指令的堆栈 end
|