📄 crt0.s
字号:
/* * crt0.S -- startup file for hppa. * rob@cygnus.com (Rob Savoye) */ .VERSION "0.2" .COPYRIGHT "crt0.S for hppa";sp .equ %r30 ; stack pointer;dp .equ %r27 ; global data pointer;arg0 .equ %r26 ; argument;arg1 .equ %r25 ; argument or high part of double argument;arg2 .equ %r24 ; argument;arg3 .equ %r23 ; argument or high part of double argument#define IMM(a,b) ldil L%a,b ! ldo R%a(b),b#define imm(i,t) ldil LS%i,t ! addi RS%i,t,t .DATA/**** * FIXME: these are just a gross hack so this will assemble ****/_bss_start .WORD_bss_end .WORD_foobar .STRINGZ "Foo Bar...\r\n";;_SYSTEM_ID .WORD;; .EXPORT _SYSTEM_ID ; FIXME this is only so it'll ; link /* * Set up the standard spaces (sections) These definitions come * from /lib/pcc_prefix.s. */ .space $TEXT$,0 .SUBSPA $BOOT$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=4 .IMPORT _start/* * stuff we need that's defined elsewhere. */ .IMPORT main, CODE .IMPORT _bss_start, DATA .IMPORT _bss_end, DATA .IMPORT environ, DATA/* * start -- set things up so the application will run. * */ .PROC .CALLINFO SAVE_SP, FRAME=48 .EXPORT $START$,ENTRY$START$ /* FIXME: this writes to page zero */ ;; setup the %30 (stack pointer) with some memory ldil L%_stack+48,%r30 ldo R%_stack+48(%r30),%r30 ; should be %r30 (sp) but then ; we'd kill our test program :-) ;; we need to set %r27 (global data pointer) here too ldil L%$global$,%r27 ldo R%$global$(%r27),%r27 ; same problem as above/* * zerobss -- zero out the bss section */ ; load the start of bss ldil L%_bss_start,%r4 ldo R%_bss_start(%r4),%r4 ; load the end of bss ldil L%_bss_end,%r5 ldo R%_bss_end(%r5),%r5bssloop addi -1,%r5,%r5 ; decrement _bss_end stb %r0,0(0,%r5) ; we do this by bytes for now even ; though it's slower, it's safer combf,= %r4,%r5, bssloop nop ldi 1,%ret0/* * Call the main routine from the application to get it going. * main (argc, argv, environ) * We pass argv as a pointer to NULL. */ bl main,%r2 nop .PROCEND/* * _exit -- Exit from the application. Normally we cause a user trap * to return to the ROM monitor for another run, but with * this monitor we can't. Still, "C" wants this symbol, it * should be here. Jumping to 0xF0000004 jumps back into the * firmware, while writing a 5 to 0xFFFE0030 causes a reset. */ .EXPORT _exit, ENTRY_exit .PROC .CALLINFO .ENTRY;; ldil L%0xf0000004,%r1;; bl %r1, %r2 ldil L'4026531844,%r19 ldo R'4026531844(%r19),%r19 blr %r19, %r2 nop ;; This just causes a breakpoint exception;; break 0x0e,0xa5a;; bv,n (%rp) nop .EXIT .PROCEND .subspa $UNWIND_START$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=56 .export $UNWIND_START$UNWIND_START .subspa $UNWIND$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=64 .subspa $UNWIND_END$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=72 .export $UNWIND_END$UNWIND_END .subspa $RECOVER_START$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=73 .export $RECOVER_START$RECOVER_START .subspa $RECOVER$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=80 .subspa $RECOVER_END$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=88 .export $RECOVER_END$RECOVER_END; The following declarations are, by default in the data space ($PRIVATE$);; .space $PRIVATE$,1/* * Here we set up the standard date sub spaces. * _dp is for the WinBond board. * * Set up some room for a stack. We just grab a chunk of memory. * We also setup some space for the global variable space, which * must be done using the reserved name "$global$" so "C" code * can find it. The stack grows towards the higher addresses. */ .subspa $DATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=16 .subspa $SHORTDATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=24 .subspa $GLOBAL$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=40 .export $global$ .export _dp$global$_dp .subspa $SHORTBSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=80,ZERO .subspa $BSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=82,ZERO .subspa $STACK$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=88,ZERO .export _stack_stack .BLOCK 0x2000/* * The heap follows the stack. To use dynamic memory routines in an * application, some space MUST be assigned to the stack. */ .subspa $HEAP$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=96,ZERO .export _heap_heap .end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -