lang-bootstrap/05/main.c

51 lines
1.2 KiB
C
Raw Normal View History

2022-02-13 15:07:26 -05:00
static unsigned char __syscall_data[] = {
// mov rax, [rsp+24]
0x48, 0x8b, 0x84, 0x24, 24, 0, 0, 0,
// mov rdi, rax
0x48, 0x89, 0xc7,
// mov rax, [rsp+32]
0x48, 0x8b, 0x84, 0x24, 32, 0, 0, 0,
// mov rsi, rax
0x48, 0x89, 0xc6,
// mov rax, [rsp+40]
0x48, 0x8b, 0x84, 0x24, 40, 0, 0, 0,
// mov rdx, rax
0x48, 0x89, 0xc2,
// mov rax, [rsp+48]
0x48, 0x8b, 0x84, 0x24, 48, 0, 0, 0,
// mov r10, rax
0x49, 0x89, 0xc2,
// mov rax, [rsp+56]
0x48, 0x8b, 0x84, 0x24, 56, 0, 0, 0,
// mov r8, rax
0x49, 0x89, 0xc0,
// mov rax, [rsp+64]
0x48, 0x8b, 0x84, 0x24, 64, 0, 0, 0,
// mov r9, rax
0x49, 0x89, 0xc1,
// mov rax, [rsp+16]
0x48, 0x8b, 0x84, 0x24, 16, 0, 0, 0,
// syscall
0x0f, 0x05,
// mov [rsp+8], rax
0x48, 0x89, 0x84, 0x24, 8, 0, 0, 0,
// ret
0xc3
};
2022-02-13 15:07:26 -05:00
#define __syscall(no, arg1, arg2, arg3, arg4, arg5, arg6)\
(((unsigned long (*)(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long))__syscall_data)\
(no, arg1, arg2, arg3, arg4, arg5, arg6))
2022-02-12 21:27:57 -05:00
2022-02-13 15:07:26 -05:00
typedef unsigned long size_t;
2022-02-13 12:24:19 -05:00
2022-02-13 15:07:26 -05:00
long write(int fd, void *buf, size_t count) {
__syscall(1, fd, buf, count, 0, 0, 0);
2022-02-13 12:51:21 -05:00
}
2022-02-13 15:07:26 -05:00
int main(int argc, char **argv) {
write(1, "Hello, world!\n", 14);
return 0;
2022-02-09 22:44:27 -05:00
}
2022-02-12 21:27:57 -05:00