.global _start _start: // in the beginning... //push %ebx // do we need to persist them??? //push %ecx //cmp $0,_impure_ptr //jne skipzero //movl $0xf5000000, _impure_ptr //mov $0xf5000000,%ebx //allzero: //movl $0, (%ebx) //add $4, %ebx //cmp $0xf5001000,%ebx //jne allzero //skipzero: /////////////////////////////////////////////////////////////////////// // move impure pointer to our special page (todo: check if not htere already!) mov _impure_ptr,%eax mov $0xf5000000,%ebx copy: mov (%eax),%ecx mov %ecx,(%ebx) add $4, %ebx add $4, %eax cmp $0xf5001000,%ebx jne copy movl $0xf5000000, _impure_ptr //////////////////////////////////////////////////////////////////////// call _init // constructors from .ctors /////////////////////////////////////////////////////////////////////// // constructors from array_init //////////////////////////// mov $__init_array_start,%eax nextctor: //cmp (__init_array_end),%eax cmp $__init_array_end,%eax je finctor push %eax call *(%eax) pop %eax add $4, %eax jmp nextctor finctor: // ready with global ctors //////////////////////////////////////////////////////////////////////// //pop %ecx //pop %ebx ############################################### # environment adress was passed on stack pop %eax mov %eax, environ ############################################### pop %ecx //argc pop %ebx //& argv and $-16,%esp //align stack sub $8,%esp push %ebx //argv push %ecx //& argc # call main (argc and argv are on the (realigned) tack) call main // ALIGN stack again (todo: do we need this!??!!) and $-16,%esp sub $4,%esp push %eax // preserve main return value call _fini //desctructors from .dtors call _flushing // force stdout flushin // pop programmm return value pop %eax // ALIGN stack (???) and $-16,%esp sub $4,%esp # push exit code and pass to _exit syscall push %eax call exit # and this should never be reached!! .wait: hlt jmp .wait