📄 division.asm
字号:
.def _h_divide
.text
_h_divide:
POPD *+; 把函数返回地址从硬件堆栈中弹到@AR0 AR0++
SAR AR0,*+; 把AR0保存到@AR0 然后AR0++
SAR AR1,* ;? 把AR1保存到@AR0 然后AR0
LARK AR0,4 ;?设置新的AR0,AR1; LARK AR0,4
LAR AR0,*0+,AR2
; _divisor的地址为FP - 3, _dividend的地址为FP - 4
;
SETC SXM ;
LAR AR2,#0FFFDH; 置AR2为-3
MAR *0+ ;把AR2指向_divisor
LAC * ;载入_divisor到ACC
BCND L1,LT ;当ACC < 0时,跳转
LACL #1H ;准备给s_a装入1
ADRK #4H ; 把AR2指向_s_divisor
SACL *,0 ;把ACC中的值1装入_s_divisor
B L2 ;
L1: ADRK #4H ; 把AR2指向_s_divisor
SPLK #-1h,* ;给s_a装入-1
NEG ;取反
SBRK #4h
SACL *,0 ;改变_divisor中的值,同时AR2指向_dividend
L2: LAR AR2,#0fffch ;
MAR *0+ ;
LACC *,0 ;载入_dividend到ACC
BCND L3,LT ;
LACL #1H
ADRK #6H ;AR2指向_s_dividend
SACL *,0 ;把ACC中的值1存入@AR2
SBRK #5h ;指针指向_dividend
B L4,*
L3: ADRK #6H ;AR2指向_s_dividend
SPLK #-1h,* ;把-1存入@AR2
NEG ;把ACC中的值_dividend取反
SBRK #6h ;修改指针
SACL *+,0 ;把取反后的值存入_dividend
;现在_divisor和_dividend中的值都是取绝对值后的结果这时可
;以把_divisor载入ACC的高位,重复SUBC _dividend 16次,
;ACC中的低16位就是商。
L4: LACC *-,12 ;把_divisor载入ACC的高位,并右移4位
; RPT #16 ;同时把AR2指向_dividend
SUBC * ;1
SUBC * ;2
SUBC * ;3
SUBC * ;4
SUBC * ;5
SUBC * ;6
SUBC * ;7
SUBC * ;8
SUBC * ;9
SUBC * ;10
SUBC * ;11
SUBC * ;12
SUBC * ;13
SUBC * ;14
SUBC * ;15
SUBC * ;16
ADRK #7h ;把AR2指向_quotient
SACL *,0 ;把ACL中的结果存到_quotient
LT * ;把_quotient放入Treg
SBRK #2h ;把AR2指向_s_divisor;
MPY *+,AR0 ;
SPL * ;把Preg中的低位存到
LT *,AR2
MPY *+
SPL * ;把_quotient*_s_divisor*_dividend的结果存入
LACC *,0 ;把返回值存入ACC
; 维护C语言的函数栈
MAR *,AR1 ;
SBRK #5h ;把AR1指向上一级函数调用时的栈顶加一,
;即为上一级存放AR0的地方。
LAR AR0,*- ;把AR0取出来,并让AR1指向栈顶
PSHD * ;把返回地址压入硬堆栈
RET ;返回
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -