/* Start.s * Assembly language assist for user programs running on top of Nachos. * * Since we don't want to pull in the entire C library, we define * what we need for a user program here, namely Start and the system * calls. */ #define IN_ASM #include "syscall.h" .text .align 2 /* ------------------------------------------------------------- * __start * Initialize running a C program, by calling "main". * * NOTE: This has to be first, so that it gets loaded at location 0. * The Nachos kernel always starts a program by jumping to location 0. * ------------------------------------------------------------- */ .globl __start .ent __start __start: jal main move $4,$0 jal Exit /* if we return from main, exit(0) */ .end __start /* ------------------------------------------------------------- * System call stubs: * Assembly language assist to make system calls to the Nachos kernel. * There is one stub per system call, that places the code for the * system call into register r2, and leaves the arguments to the * system call alone (in other words, arg1 is in r4, arg2 is * in r5, arg3 is in r6, arg4 is in r7) * * The return value is in r2. This follows the standard C calling * convention on the MIPS. * ------------------------------------------------------------- */ .globl Halt .ent Halt Halt: addiu $2,$0,SC_Halt syscall j $31 .end Halt .globl MSG .ent MSG MSG: addiu $2,$0,SC_MSG syscall j $31 .end MSG .globl Add .ent Add Add: addiu $2,$0,SC_Add syscall j $31 .end Add .globl Exit .ent Exit Exit: addiu $2,$0,SC_Exit syscall j $31 .end Exit .globl Exec .ent Exec Exec: addiu $2,$0,SC_Exec syscall j $31 .end Exec .globl ExecV .ent ExecV ExecV: addiu $2,$0,SC_ExecV syscall j $31 .end ExecV .globl Join .ent Join Join: addiu $2,$0,SC_Join syscall j $31 .end Join .globl Create .ent Create Create: addiu $2,$0,SC_Create syscall j $31 .end Create .globl Remove .ent Remove Remove: addiu $2,$0,SC_Remove syscall j $31 .end Remove .globl Open .ent Open Open: addiu $2,$0,SC_Open syscall j $31 .end Open .globl Read .ent Read Read: addiu $2,$0,SC_Read syscall j $31 .end Read .globl Write .ent Write Write: addiu $2,$0,SC_Write syscall j $31 .end Write .globl Close .ent Close Close: addiu $2,$0,SC_Close syscall j $31 .end Close .globl Seek .ent Seek Seek: addiu $2,$0,SC_Seek syscall j $31 .end Seek .globl ThreadFork .ent ThreadFork ThreadFork: addiu $2,$0,SC_ThreadFork syscall j $31 .end ThreadFork .globl ThreadYield .ent ThreadYield ThreadYield: addiu $2,$0,SC_ThreadYield syscall j $31 .end ThreadYield .globl ThreadExit .ent ThreadExit ThreadExit: addiu $2, $0, SC_ThreadExit syscall j $31 .end ThreadExit .globl ThreadJoin .ent ThreadJoin ThreadJoin: addiu $2, $0, SC_ThreadJoin syscall j $31 .end ThreadJoin .globl PrintInt .ent PrintInt PrintInt: addiu $2,$0,SC_PrintInt syscall j $31 .end PrintInt /* dummy function to keep gcc happy */ .globl __main .ent __main __main: j $31 .end __main