//实现32位数除以16位数功能 //x -------------- 被除数 //y -------------- 除数 //z --------------- 返回值
// --------------- c 调汇编 ---------------- // ----因为不会在汇编中定义局部变量,所有参数均用AR寄存器存储-----
.bss H_div,1 .def _DivideQ14 .global _z .globl _y .globl _x .text ****************************************************** * FUNCTION DEF : _DivideQ14 ****************************************************** _DivideQ14:
POPD *+ ;Move return address to C stack SAR AR0,*+ ;Save Frame Pointer SAR AR1,* ;Save Stack Pointer LARK AR0,#3 ;Size of Frame LAR AR0,*0+,AR0 ;ARP = AR0,AR0 = New Frame SBRK #3 LAR AR1,* ;x ------------------------->AR1 SBRK #1 LAR AR2,* ;y ------------------------>AR2 SBRK #1 LAR AR3,* ;z ------------------------->AR3 LARK AR4,#3FFFH MAR *,AR4 LT *,AR1 ;T = 0x3FFF MPY * ,AR5 ; PREG <---------------x * 0x3FFF PAC SACH *,AR6 ; 执行这条语句时,AR6中内容与复位后无异,即这条语句执行失败. SACL *,AR4 ; 以下语句都失败,单步执行的时候AR的值无任何变化 LACC *,16,AR5 ADDS *,AR4 SACH *,AR5 SACL *,AR2 LACC *,16,AR6 SACH *,AR4 LACL *,AR6 RPT #15 SUBC *,AR4 SACL * XOR *,AR5 OR *,AR6 RPT #15 SUBC *,AR6 SACH *,AR3 SACL * MAR *- SBRK 4 LAR AR0,*- PSHD * RET |