📄 crt0.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 + -