Skip to content

Instantly share code, notes, and snippets.

@mb6ockatf
Created July 13, 2025 11:29
Show Gist options
  • Save mb6ockatf/8ef4d11926ca9a26234603553ec4b9c1 to your computer and use it in GitHub Desktop.
Save mb6ockatf/8ef4d11926ca9a26234603553ec4b9c1 to your computer and use it in GitHub Desktop.
#include "syscalls.h"
#define internal static
#define stdout 1
typedef unsigned long int uintptr; /* size_t */
typedef long int intptr; /* ssize_t */
#ifdef __x86_64__
asm (
"_start:\n"
" xorl %ebp,%ebp\n"
" movq 0(%rsp),%rdi\n" /* argc loaded */
" lea 8(%rsp),%rsi\n" /* argv[0] loaded */
" call main\n"
" movq %rax,%rdi\n"
" movl $(SYS_exit),%eax\n"
" syscall\n"
" ret\n");
asm(
"syscall3:\n"
" mov %rdi,%rax\n"
" mov %rsi,%rdi\n"
" mov %rdx,%rsi\n"
" mov %rcx,%rdx\n"
" syscall\n"
" ret\n"
);
#endif
uintptr syscall3 (uintptr number, void *arg1, void *arg2, void *arg3);
internal uintptr
write (uintptr fd, const void *data, uintptr n_bytes)
{
return (uintptr) syscall3 (SYS_write, (void *) fd, (void *) data,
(void *) n_bytes);
}
internal uintptr
strlen (const char *str)
{
const char *p;
for (p = str; *p; ++p);
return (uintptr) (p - str);
}
internal uintptr
puts (const char *str)
{
return write (stdout, str, strlen (str));
}
int
main (void)
{
puts ("hello world\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment