A ambição ou um desejo excessivamente severo de pureza podem levar você a fazer uma montagem em linha. Por exemplo, em sistemas x86_64, você pode fazer uma chamada open(2)
do sistema assim:
#include <sys/syscall.h>
int
linux_open(const char *pathname, unsigned long flags, unsigned long mode)
{
long ret;
asm volatile ("syscall" : "=a" (ret) : "a" (__NR_open),
"D" (pathname), "S" (flags), "d" (mode) :
"cc", "memory", "rcx",
"r8", "r9", "r10", "r11" );
if (ret < 0)
{
errno = -ret;
ret = -1;
}
return (int) ret;
}
Você pode olhar para a fonte de libc mais compreensível (como Musl ) para descobrir como as chamadas do sistema também são implementadas .