📄 cygmon-crt0.s
字号:
/* * C startup code for the Fujitsu SPARClite demo board * * Copyright (c) 1995, 1996 Cygnus Support * * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice is included verbatim in any distributions. No written agreement, * license, or royalty fee is required for any of the authorized uses. * Modifications to this software may be copyrighted by their authors * and need not follow the licensing terms described here, provided that * the new terms are clearly indicated on the first page of each file where * they apply. */#include "asm.h"#ifdef TARGET_CPU_SPARC64#define STACK_BIAS 2047#define SAVE_SIZE -128#else#define SAVE_SIZE -64#endif .data .align 8SYM(environ): ! this is the first address in the data section .long 0SYM(argc): .long 0 .text .align 8 .globl SYM(start) .globl startSYM(start):start: /* see if the stack is already setup. if not, then default * to using the value of %sp as set by the ROM monitor */ sethi %hi(__stack), %g1 or %g1,%lo(__stack),%g1 cmp %g0,%g1 be 1f nop#ifdef STACK_BIAS sub %g1, STACK_BIAS, %g1#endif mov %g1, %sp ! set the stack pointer mov 0, %fp1: /* zero the bss section */ sethi %hi(__bss_start),%g2 or %g2,%lo(__bss_start),%g2 ! start of bss sethi %hi(_end),%g3 or %g3,%lo(_end),%g3 ! end of bss mov %g0,%g1 ! so std has two zeroszerobss: std %g0,[%g2] add %g2,8,%g2 cmp %g2,%g3 bleu,a zerobss nop /* * initialize target specific stuff. Only execute these * functions it they exist. */init: sethi %hi(SYM(hardware_init_hook)), %g1 or %g1,%lo(SYM(hardware_init_hook)),%g1 cmp %g0,%g1 be 1f nop call SYM(hardware_init_hook) nop1: sethi %hi(SYM(software_init_hook)), %g1 or %g1,%lo(SYM(software_init_hook)),%g1 cmp %g0,%g1 be 2f nop call SYM(software_init_hook) nop2: set SYM(__sigtramp), %o0 call SYM(__install_signal_handler) nop set do_dtors,%o0 call SYM(atexit) nop call do_ctors nop set SYM(argc), %o0 call SYM(__getProgramArgs) nop mov %o0, %o1 set SYM(argc), %o0 ld [%o0], %o0 call SYM(main) nop /* call exit from the C library so atexit gets called, and the * C++ destructors get run. This calls our exit routine below * when it's done. */ call SYM(exit) nopdo_ctors: save %sp,SAVE_SIZE,%sp set __CTOR_LIST__,%l0our_entry: ld [%l0],%l1 add %l0,4,%l0 tst %l11: beq 2f nop ld [%l0],%l2 add %l0,4,%l0 call %l2 nop deccc %l1 b 1b nop2: ret restoredo_dtors: save %sp,SAVE_SIZE,%sp set __DTOR_LIST__,%l0 b our_entry nop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -