📄 421acker
字号:
// 000 ; Ackermann Function
// 000 ; ==================
// 000 ;
// 000 ; ack(m,n) = (m=0): n+1
// 000 ; (n=0): ack(m-1,1)
// 000 ; else: ack(m-1,ack(m,n-1))
// 000 ;
// 000 ; ack(1,1) = 3
// 000 ; ack(2,2) = 7
// 000 ; ack(3,3) = 61
// 000
// 000
60080001 // 000 MOV R01, 1 ; m
60100001 // 004 MOV R02, 1 ; n
// 008 ;
E0F80000 // 008 LDH R31, Stack ; stack pointer
80000006 // 00c CALL ack ;
44FFC060 // 010 OR R31, R31, Stack & $1FFF ;
FF000000 // 014 HALT ;
// 018
EAF04000 // 018 ack: LRFS R30, RPC ; save RPC
60FFC008 // 01c INC R31, 8 ; increase SP
// 020 ;
6B004000 // 020 TST.f R01 ; A(0,n) ?
FCC0000D // 024 Beq.a ack_Ret ; if yes,
60108001 // 028 INC R02 ; compute and return
// 02c ;
2EF7FFFE // 02c ST R30, R31, -8 ; save return address and
2E0FFFFF // 030 ST R01, R31, -4 ; n on stack
// 034 ;
6B008000 // 034 TST.f R02 ; A(m,0) ?
FCC00004 // 038 Beq.a ack_L1 ; if yes, branch to computation
60100001 // 03c MOV R02, 1 ; of A(m-1,1)
// 040 ;
80000006 // 040 CALL ack ; compute A(m,n), hence
68108001 // 044 DEC R02 ; first n=A(m,n-1)
// 048 ;
80000006 // 048 ack_L1: CALL ack ; compute
68084001 // 04c DEC R01 ; A(m-1,n)
// 050 ;
0EF7FFFE // 050 LD R30, R31, -8 ; load RPC
0E0FFFFF // 054 LD R01, R31, -4 ; load m
// 058 ;
EB00001E // 058 ack_Ret: RET R30 ; correct SP
68FFC008 // 05c DEC R31, 8 ; and return
// 060
XXXXXXXX // 060 Stack: ds.w 1 ; stack
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -