//printf needs following syscalls: sbrk write close fstat isatty lseek read // #include int close(int file) { return -1; } int fstat(int file, struct stat *st) { st->st_mode = S_IFCHR; return 0; } int isatty(int file) { return 1; } int lseek(int file, int ptr, int dir) { return 0; } int read(int file, char *ptr, int len) { return 0; } int open(const char *name, int flags, int mode) { return -1; } int write(int file, char *ptr, int len) { int todo; for (todo = 0; todo < len; todo++) { char byte=(*ptr++); int byt=byte; int ebx; // will hold return value; // system call asm("pusha"); asm("mov $61,%eax"); // select syscall) asm("mov %0,%%edx"::"m"(byt)); //asm("mov $88,%edx"); asm("int $0x80"); // actual syscall ! interrupt asm("mov %%ebx, %0": "=b" (ebx)); asm("popa"); // } return len; } caddr_t sbrk(int incr) { // extern char _end; /* Defined by the linker */ char _end; static char *heap_end; char *prev_heap_end; if (heap_end == 0) { heap_end = &_end; } prev_heap_end = heap_end; /* if (heap_end + incr > stack_ptr) { write (1, "Heap and stack collision\n", 25); abort (); } */ heap_end += incr; return (caddr_t) prev_heap_end; } //