How to issue system calls without a C library X86: int sys_write(int fd, void *buf, int count) { int ret; asm("int $0x80" : "=a" (ret) : "0" (__NR_write), "b" (fd), "c" (buf), "d" (count)); return ret; } 00000000 : 0: 53 push %ebx 1: b8 04 00 00 00 mov $0x4,%eax 6: 8b 54 24 10 mov 0x10(%esp),%edx a: 8b 4c 24 0c mov 0xc(%esp),%ecx e: 8b 5c 24 08 mov 0x8(%esp),%ebx 12: cd 80 int $0x80 14: 5b pop %ebx 15: c3 ret 16: 8d 76 00 lea 0x0(%esi),%esi 19: 8d bc 27 00 00 00 00 lea 0x0(%edi),%edi ARM (OABI): #define __sys2(x) #x #define __sys1(x) __sys2(x) #define __syscall(name) __sys1(__NR_##name) "" int sys_write(int fd, void *buf, int count) { register long ret __asm__("r0"); register long __r0 __asm__("r0") = (long)fd; register long __r1 __asm__("r1") = (long)buf; register long __r2 __asm__("r2") = (long)count; asm("swi " __syscall(write) : "=r" (ret): "0" (__r0), "r" (__r1), "r" (__r2)); return ret; } 00000000 : 0: ef900004 svc 0x00900004 4: e12fff1e bx lr With EABI parameter passing is simplified Syscall number is passed in r7 Arguments are r0 onward (unchanged)