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