⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crt0.s

📁 Newlib 嵌入式 C库 标准实现代码
💻 S
字号:
/*######################################################################## RDOS operating system# Copyright (C) 1988-2006, Leif Ekblad## This library is free software; you can redistribute it and/or modify# it under the terms of the GNU Lesser General Public License as published# by the Free Software Foundation; either version 2.1 of the License, or# (at your option) any later version.## This library is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU Lesser General Public License for more details.## You should have received a copy of the GNU Lesser General Public# License along with this library; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## The author of this program may be contacted at leif@rdos.net## crt0.S                                                               # GCC startupcode for RDOS###########################################################################*/  #include "user.def"    KEY_ENTRIES = 256      .macro UserGate nr     .byte 0x9A    .long \nr    .word 2    .endm     .data    .align  8_key_section:    .word 0_key_ref_arr:    .long 0_key_dtor_arr:    .long 0	.text	.align 4					  					    /*############################################################################   Name       : _start##   Purpose....: GCC startup-code###########################################################################*/	.global _start_start:	call get_impure_data_size	movl %eax,%ecx	UserGate allocate_app_mem_nr	xorl %eax,%eax	.byte 0x64	movl %edx,(%eax)	movl %edx,%edi	rep	stosb	pushl %edx    movl $(4 * KEY_ENTRIES),%eax	movl %eax,%ecx    UserGate allocate_app_mem_nr    movl $4,%eax    .byte 0x64    movl %edx,(%eax)    movl %edx,%edi	xorl %eax,%eax    rep    stosb    movl $(4 * KEY_ENTRIES),%eax	movl %eax,%ecx    UserGate allocate_app_mem_nr    movl %edx,_key_ref_arr    movl %edx,%edi	xorl %eax,%eax    rep    stosb    movl $(4 * KEY_ENTRIES),%eax	movl %eax,%ecx    UserGate allocate_app_mem_nr    movl %edx,_key_dtor_arr    movl %edx,%edi	xorl %eax,%eax    rep    stosb	UserGate create_user_section_nr	movw %bx,_key_section	call __init_rdos	add $4, %esp	movl $0x1000,%eax	UserGate allocate_app_mem_nr	pushl %edx	UserGate get_cmd_line_nr	xorl %ecx,%ecx	xorb %ah,%aharg_loop:	movl %edi,(%edx)	addl $4,%edx	movb (%edi),%al	orb %al,%al	je arg_donearg_scan:		movb (%edi),%al	orb %al,%al	je next_arg	cmpb $0x22,%al	jne arg_no_quote	xorb $1,%ah	jmp arg_scan_nextarg_no_quote:	orb %ah,%ah	jnz arg_scan_next	cmpb $0x20,%al	je next_arg	cmpb $0x8,%al	je next_argarg_scan_next:	incl %edi	jmp arg_scannext_arg:	incl %ecxto_next_arg:	orb %al,%al	je arg_done	xorb %al,%al	movb %al,(%edi)	incl %edi	movb (%edi),%al	cmpb $0x20,%al	je to_next_arg	cmpb $0x8,%al	je to_next_arg		jmp arg_loop	arg_done:	int $3	pushl %ecx	call main	add $8, %esp	pushl %eax	call	exit					    /*############################################################################   Name       : _exit##   Purpose....: GCC exit-code###########################################################################*/	.global _exit_exit:	pushl %ebp	movl %esp,%ebp	movl 8(%ebp),%eax	UserGate unload_exe_nr					    					    /*############################################################################   Name       : __getreent##   Purpose....: ?###########################################################################*/	.global __getreent__getreent:    xorl %eax,%eax	.byte 0x64	movl (%eax),%eax	ret					    					    					    /*############################################################################   Name       : __rdos_thread_key_create##   Purpose....: Emulate GCC pthread_key_create##   Parameters.: dtor##   Returns....: Key index###########################################################################*/	.global __rdos_thread_key_create	__rdos_thread_key_create:    int $3	pushl %ebp	movl %esp,%ebp	pushl %ebx	pushl %ecx    mov _key_section,%bx    UserGate enter_user_section_nr		movl _key_ref_arr,%ebx    movl KEY_ENTRIES,%ecxrtkc_scan_loop:    movl (%ebx), %eax    orl %eax, %eax    jz rtkc_entry_found    add $4, %ebx    loop rtkc_scan_loop    movl $-1, %eax    jmp rtkc_leavertkc_entry_found:    movb $255,3(%ebx)    subl _key_ref_arr,%ebx    addl _key_dtor_arr,%ebx	movl 8(%ebp),%eax	movl %eax,(%ebx)	subl _key_dtor_arr,%ebx	movl %ebx,%eaxrtkc_leave:    mov _key_section, %bx    UserGate leave_user_section_nr	    popl %ecx    popl %ebx		leave	ret					    					    					    /*############################################################################   Name       : __rdos_thread_key_delete##   Purpose....: Emulate GCC pthread_key_delete##   Parameters.: index##   Returns....: result###########################################################################*/	.global __rdos_thread_key_delete	__rdos_thread_key_delete:    int $3	pushl %ebp	movl %esp,%ebp	pushl %ebx    mov _key_section,%bx    UserGate enter_user_section_nr		movl 8(%ebp),%ebx	testb $3,%bl	jnz rtkd_fail    cmpl $(4 * KEY_ENTRIES),%ebx    jae rtkd_fail    	    addl _key_ref_arr,%ebx    movb $0,3(%ebx)    mov (%ebx),%eax    orl %eax,%eax    jz rtkd_ok    subl _key_ref_arr,%ebx        movl $0,(%ebx)    jmp rtkd_okrtkd_fail:    movl $1,%eax     jmp rtkd_leave   rtkd_ok:    xorl %eax,%eax rtkd_leave:    mov _key_section, %bx    UserGate leave_user_section_nr	    popl %ebx		leave	ret					    					    					    /*############################################################################   Name       : __rdos_thread_getspecific##   Purpose....: Emulate GCC pthread_getspecific##   Parameters.: index##   Returns....: value###########################################################################*/	.global __rdos_thread_getspecific	__rdos_thread_getspecific:    int $3	pushl %ebp	movl %esp,%ebp	pushl %ebx	movl 8(%ebp),%ebx	testb $3,%bl	jnz rtg_fail    cmpl $(4 * KEY_ENTRIES),%ebx    jae rtg_fail    movl $4,%eax    .byte 0x64    movl (%eax),%eax    addl %eax,%ebx    movl (%ebx),%eax    jmp rtg_donertg_fail:    xorl %eax,%eaxrtg_done:    popl %ebx		leave	ret					    					    					    /*############################################################################   Name       : __rdos_thread_setspecific##   Purpose....: Emulate GCC pthread_setspecific##   Parameters.: index#                value###########################################################################*/	.global __rdos_thread_setspecific	__rdos_thread_setspecific:    int $3	pushl %ebp	movl %esp,%ebp	pushl %ebx	pushl %ecx	movl 8(%ebp),%ebx	testb $3,%bl	jnz rts_fail    cmpl $(4 * KEY_ENTRIES),%ebx    jae rts_fail    movl $4,%eax    .byte 0x64    movl (%eax),%eax    addl %eax,%ebx	movl 12(%ebp),%eax    movl %eax,(%ebx)    xorl %eax,%eax    jmp rts_donerts_fail:    movl $1,%eaxrts_done:    popl %ebx		leave	ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -