|  | /* | 
|  | * MIPS o32 Linux syscall example | 
|  | * | 
|  | * http://www.linux-mips.org/wiki/RISC/os | 
|  | * http://www.linux-mips.org/wiki/MIPSABIHistory | 
|  | * http://www.linux.com/howtos/Assembly-HOWTO/mips.shtml | 
|  | * | 
|  | * mipsel-linux-gcc -nostdlib -mno-abicalls -fno-PIC -mabi=32 \ | 
|  | *                  -O2 -static -o hello-mips hello-mips.c | 
|  | * | 
|  | */ | 
|  | #define __NR_SYSCALL_BASE	4000 | 
|  | #define __NR_exit			(__NR_SYSCALL_BASE+  1) | 
|  | #define __NR_write			(__NR_SYSCALL_BASE+  4) | 
|  |  | 
|  | static inline void exit1(int status) | 
|  | { | 
|  | register unsigned long __a0 asm("$4") = (unsigned long) status; | 
|  |  | 
|  | __asm__ __volatile__ ( | 
|  | "	.set push	\n" | 
|  | "	.set noreorder	\n" | 
|  | "	li	$2, %0	\n" | 
|  | "	syscall		\n" | 
|  | "	.set pop	" | 
|  | : | 
|  | : "i" (__NR_exit), "r" (__a0) | 
|  | : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", | 
|  | "memory"); | 
|  | } | 
|  |  | 
|  | static inline int write(int fd, const char *buf, int len) | 
|  | { | 
|  | register unsigned long __a0 asm("$4") = (unsigned long) fd; | 
|  | register unsigned long __a1 asm("$5") = (unsigned long) buf; | 
|  | register unsigned long __a2 asm("$6") = (unsigned long) len; | 
|  | register unsigned long __a3 asm("$7"); | 
|  | unsigned long __v0; | 
|  |  | 
|  | __asm__ __volatile__ ( | 
|  | "	.set push	\n" | 
|  | "	.set noreorder	\n" | 
|  | "	li	$2, %2	\n" | 
|  | "	syscall		\n" | 
|  | "	move	%0, $2	\n" | 
|  | "	.set pop	" | 
|  | : "=r" (__v0), "=r" (__a3) | 
|  | : "i" (__NR_write), "r" (__a0), "r" (__a1), "r" (__a2) | 
|  | : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", | 
|  | "memory"); | 
|  |  | 
|  | /*    if (__a3 == 0) */ | 
|  | return (int) __v0; | 
|  | /* | 
|  | errno = __v0; | 
|  | return -1; | 
|  | */ | 
|  | } | 
|  |  | 
|  | void __start(void) | 
|  | { | 
|  | write (1, "Hello, World!\n", 14); | 
|  | exit1 (42); | 
|  | } |