zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

inline_assembly.zig (869B) - Raw


      1 pub fn main() noreturn {
      2     const msg = "hello world\n";
      3     _ = syscall3(SYS_write, STDOUT_FILENO, @intFromPtr(msg), msg.len);
      4     _ = syscall1(SYS_exit, 0);
      5     unreachable;
      6 }
      7 
      8 pub const SYS_write = 1;
      9 pub const SYS_exit = 60;
     10 
     11 pub const STDOUT_FILENO = 1;
     12 
     13 pub fn syscall1(number: usize, arg1: usize) usize {
     14     return asm volatile ("syscall"
     15         : [ret] "={rax}" (-> usize),
     16         : [number] "{rax}" (number),
     17           [arg1] "{rdi}" (arg1),
     18         : .{ .rcx = true, .r11 = true });
     19 }
     20 
     21 pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
     22     return asm volatile ("syscall"
     23         : [ret] "={rax}" (-> usize),
     24         : [number] "{rax}" (number),
     25           [arg1] "{rdi}" (arg1),
     26           [arg2] "{rsi}" (arg2),
     27           [arg3] "{rdx}" (arg3),
     28         : .{ .rcx = true, .r11 = true });
     29 }
     30 
     31 // exe=succeed
     32 // target=x86_64-linux