97 lines
1.2 KiB
ArmAsm
97 lines
1.2 KiB
ArmAsm
|
|
#define CCFSZ 96
|
|
|
|
.file "str0.s"
|
|
|
|
.text
|
|
.globl start
|
|
|
|
start:
|
|
/*
|
|
* Set up a stack.
|
|
*/
|
|
set start, %o1
|
|
save %o1, -CCFSZ, %sp
|
|
|
|
/*
|
|
* Relocate.
|
|
*/
|
|
1: call 2f
|
|
nop
|
|
2: add %o7, (start-1b), %l0
|
|
set start, %l1
|
|
set _end, %o0
|
|
sub %o0, %l1, %l2 ! length
|
|
3: ld [%l0], %o0
|
|
add %l0, 4, %l0
|
|
st %o0, [%l1]
|
|
subcc %l2, 4, %l2
|
|
bg 3b
|
|
add %l1, 4, %l1
|
|
|
|
set 4f, %g1
|
|
jmp %g1
|
|
nop
|
|
|
|
4:
|
|
/*
|
|
* Clear BSS
|
|
*/
|
|
set _edata, %o0 ! bzero(edata, end - edata)
|
|
set _end, %o1
|
|
call _bzero
|
|
sub %o1, %o0, %o1
|
|
|
|
/*
|
|
* Save address of PROM vector (passed in %i0).
|
|
*/
|
|
sethi %hi(_promvec), %o0
|
|
st %i0, [%o0 + %lo(_promvec)]
|
|
|
|
/*
|
|
* That's it, really...
|
|
*/
|
|
call _main
|
|
mov %i0, %o0
|
|
|
|
ret
|
|
restore
|
|
|
|
/*
|
|
* XXX - Space saving .div & .rem routines (small & non-negative numbres only)
|
|
*/
|
|
.align 4
|
|
.global .div, .udiv
|
|
! int n = 0; while (a >= b) { a -= b; n++; }; return n;
|
|
.div:
|
|
.udiv:
|
|
cmp %o0, %o1
|
|
bl 2f
|
|
mov 0, %o5
|
|
1:
|
|
sub %o0, %o1, %o0
|
|
cmp %o0, %o1
|
|
bge 1b
|
|
add %o5, 1, %o5
|
|
2:
|
|
retl
|
|
mov %o5, %o0
|
|
|
|
.align 4
|
|
.global .rem, .urem
|
|
! while (a>=b) a -= b; return a;
|
|
.rem:
|
|
.urem:
|
|
cmp %o0, %o1
|
|
bl 2f
|
|
nop
|
|
sub %o0, %o1, %o0
|
|
1:
|
|
cmp %o0, %o1
|
|
bge,a 1b
|
|
sub %o0, %o1, %o0
|
|
2:
|
|
retl
|
|
nop
|
|
|