struct syscall_result { long val; int errno; }; static struct syscall_result syscall_return(long result) { struct syscall_result res; if (((unsigned long)result) >= ((unsigned long)-125)) { res.errno = - result; res.val = -1; } else { res.errno = 0; res.val = result; } return res; } static struct syscall_result syscall1(unsigned long nr, unsigned long arg1) { long res; asm volatile( "int $0x80" : "=a" (res) : "a" (nr), "b" (arg1)); return syscall_return(res); } static struct syscall_result syscall3(unsigned long nr, unsigned long arg1, unsigned long arg2, unsigned long arg3) { long res; asm volatile( "int $0x80" : "=a" (res) : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3)); return syscall_return(res); } #define NR_exit 1 #define NR_write 4 /* Standard file descriptors */ #define STDIN_FILENO 0 /* Standard input */ #define STDOUT_FILENO 1 /* Standard output */ #define STDERR_FILENO 2 /* Standard error output */ typedef long ssize_t; typedef unsigned long size_t; static ssize_t write(int fd, const void *buf, size_t count) { struct syscall_result res; res = syscall3(NR_write, fd, (unsigned long)buf, count); return res.val; } static void _exit(int status) { struct syscall_result res; res = syscall1(NR_exit, status); } static void main(void) { static const char msg[] = "hello world\r\n"; write(STDOUT_FILENO, msg, sizeof(msg)); _exit(0); }