diff --git a/main.c b/main.c new file mode 100644 index 0000000..7e2442f --- /dev/null +++ b/main.c @@ -0,0 +1,8 @@ +#include "headers/nstdo.h" +extern long sys_write(int fd, const void *buf, size_t count); + +int main(void) { + const char msg[] = "Hello, World!\n"; + sys_write(1, msg, sizeof(msg)-1); + return 0; +} diff --git a/nstdo.h b/nstdo.h new file mode 100644 index 0000000..919274e --- /dev/null +++ b/nstdo.h @@ -0,0 +1,52 @@ +#ifndef MINI_STDIO_H +#define MINI_STDIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned long size_t; +typedef long off_t; + +#define O_RDONLY 0 +#define O_WRONLY 1 +#define O_RDWR 2 +#define O_CREAT 64 +#define O_TRUNC 512 +#define O_APPEND 1024 +#define O_CLOEXEC 02000000 + +typedef __builtin_va_list va_list; +#define va_start(ap,last) __builtin_va_start(ap,last) +#define va_arg(ap,type) __builtin_va_arg(ap,type) +#define va_end(ap) __builtin_va_end(ap) + +#define SYS_READ 0 +#define SYS_WRITE 1 +#define SYS_OPEN 2 +#define SYS_CLOSE 3 +#define SYS_LSEEK 8 + +static inline long _syscall3(long nr,long a1,long a2,long a3){long ret;asm volatile("syscall":"=a"(ret):"a"(nr),"D"(a1),"S"(a2),"d"(a3):"rcx","r11","memory");return ret;} + +#ifndef MY_BUFSIZ +#define MY_BUFSIZ 4096 +#endif + +typedef struct{int fd;char buf[MY_BUFSIZ];size_t pos;size_t len;int mode;}MY_FILE; + +MY_FILE* my_fopen(const char* path,int flags,int mode); +int my_fclose(MY_FILE* f); +size_t my_fread(void* ptr,size_t size,size_t nmemb,MY_FILE* f); +size_t my_fwrite(const void* ptr,size_t size,size_t nmemb,MY_FILE* f); +int my_putc(int c,MY_FILE* f); +int my_puts(const char* s,MY_FILE* f); +off_t my_seek(MY_FILE* f,off_t offset,int whence); +int my_printf(MY_FILE* f,const char* fmt,...); +int my_vprintf(MY_FILE* f,const char* fmt,va_list ap); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/syscalls.asm b/syscalls.asm new file mode 100644 index 0000000..1e3e39d --- /dev/null +++ b/syscalls.asm @@ -0,0 +1,16 @@ +global _start +global sys_write +extern main + +section .text + +sys_write: + mov rax, 1 + syscall + ret + +_start: + call main + mov rdi, rax + mov rax, 60 + syscall \ No newline at end of file