aboutsummaryrefslogtreecommitdiff
path: root/std/std.zig
diff options
context:
space:
mode:
Diffstat (limited to 'std/std.zig')
-rw-r--r--std/std.zig23
1 files changed, 23 insertions, 0 deletions
diff --git a/std/std.zig b/std/std.zig
new file mode 100644
index 0000000000..3bcf9e4783
--- /dev/null
+++ b/std/std.zig
@@ -0,0 +1,23 @@
+fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize {
+ let mut result : isize;
+ asm volatile (
+ "mov %[number], %%rax\n"
+ "mov %[arg1], %%rdi\n"
+ "mov %[arg2], %%rsi\n"
+ "mov %[arg3], %%rdx\n"
+ "syscall\n"
+ "mov %%rax, %[ret]\n"
+ : [ret] "=r" (result)
+ : [number] "r" (number), [arg1] "r" (arg1), [arg2] "r" (arg2), [arg3] "r" (arg3)
+ : "rcx", "r11", "rax", "rdi", "rsi", "rdx");
+ return result;
+}
+
+// TODO error handling
+// TODO zig strings instead of C strings
+// TODO handle buffering and flushing
+pub print_str(str : *const u8, len: isize) {
+ let SYS_write = 1;
+ let stdout_fileno = 1;
+ syscall3(SYS_write, stdout_fileno, str as isize, str_len);
+}