Advertisement
Guest User

Untitled

a guest
Jul 26th, 2024
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.53 KB | None | 0 0
  1. /* compile
  2.  * gcc -nostdlib -ffreestanding -nostartfiles -nostdinc hello.c -o hello
  3.  */
  4. #define null ((void *)0)
  5. #define NULL null
  6. #define SYSREAD 0
  7. #define SYSWRITE 1
  8. #define SYSOPEN 2
  9. #define SYSEXIT 60
  10. #define SYSMMAP 9
  11. #define STDOUT_FILENO 1
  12. #define STDIN_FILENO 0
  13.  
  14. typedef unsigned long long int uint64_t;
  15. typedef signed long long int int64_t;
  16. typedef unsigned int size_t;
  17. typedef unsigned char uint8_t;
  18.  
  19. /* boolean type */
  20. typedef uint8_t _bool;
  21. #ifdef bool
  22. #undef bool
  23. #define bool _bool;
  24. #define false 0
  25. #define true 1
  26. #else
  27. #define bool _bool
  28. #define false 0
  29. #define true 1
  30. #endif
  31.  
  32. void _exit(int exitcode) {
  33.     __asm__ inline(
  34.         "movl %0 ,%%edi;"
  35.         "xorl %%eax, %%eax;"
  36.         "movl %1, %%eax;"
  37.         "syscall" ::"r"(exitcode),
  38.         "r"(SYSEXIT));
  39. }
  40.  
  41. typedef __builtin_va_list _va_list;
  42. #define _va_start(v, ...) __builtin_va_start(v, 0)
  43. // #define _va_start(v,l)     __builtin_va_start(v,l)
  44. #define _va_end(v) __builtin_va_end(v)
  45. #define _va_arg(v, l) __builtin_va_arg(v, l)
  46.  
  47. char *_itoa(int number);
  48.  
  49. #define _static_assert(condition, message) \
  50.     if (!(condition)) {                    \
  51.         _print(_itoa(__LINE__));           \
  52.         _print(" : ");                     \
  53.         _print(__FILE__);                  \
  54.         _print(" : ");                     \
  55.         _print(__func__);                  \
  56.         _print("()\n");                    \
  57.         _print("\t[ ");                    \
  58.         _print(#condition);                \
  59.         _print(" ] FAILED\n");             \
  60.         _print("MESSAGE: ");               \
  61.         _print(message);                   \
  62.         _print("\n");                      \
  63.         _exit(-1);                         \
  64.     }
  65.  
  66. #define _throw_assert(message) \
  67.     _print(_itoa(__LINE__));   \
  68.     _print(" : ");             \
  69.     _print(__FILE__);          \
  70.     _print(" : ");             \
  71.     _print(__func__);          \
  72.     _print("()\n");            \
  73.     _print(message);           \
  74.     _print("\n");              \
  75.     _exit(-1);
  76.  
  77. #define CHECKNULL(buf)                                 \
  78.     if (buf == null) {                                 \
  79.         _throw_assert(" buffer is null<((void *)0)>"); \
  80.     }
  81.  
  82. #ifndef __STACK_CHK_FAIL__
  83. #define __STACK_CHK_FAIL__
  84. int __stack_chk_fail(void) { return 0; };
  85. #endif
  86.  
  87. size_t _strlen(const char *buf) {
  88.     if (buf == null) {
  89.         _exit(-1);
  90.     }
  91.     size_t count = 0;
  92.     while (*buf != '\0') {
  93.         buf++;
  94.         count++;
  95.     }
  96.     return count;
  97. }
  98.  
  99. void *_mmap(void *addr, uint64_t length, int64_t prot, int64_t flags,
  100.             int64_t fd, int64_t offset) {
  101.     void *ptr = null;
  102.     __asm__ inline(
  103.         "movq %%rcx,%%r10;"
  104.         "syscall;"
  105.         "mov %%rax, %[return_ptr];"
  106.         : [return_ptr] "=rm"(ptr)
  107.         : "a"(SYSMMAP));
  108.     return ptr;
  109. }
  110.  
  111. // malloc using mmap
  112. [[nodiscard("returns pointer to heap memory")]] void *_malloc(size_t size) {
  113.     void *ptr = null;
  114.     __asm__ inline(
  115.         "mov $0, %%r9;"     // offset
  116.         "mov $0, %%r8;"     // file descriptor
  117.         "mov $34,%%r10;"    // MAP_PRIVATE || MAP_SHARED
  118.         "movq $0, %%rdi;"   // mapp destination (void addr)
  119.         "movq $3 , %%rdx;"  // PROT_READ || PROT_WRITE
  120.         "syscall;"
  121.         "mov %%rax, %[return_ptr];"
  122.         : [return_ptr] "=rm"(ptr)
  123.         : "S"(size), "a"(SYSMMAP));
  124.  
  125.     return ptr;
  126. }
  127.  
  128. int _reverse(char *str, size_t length) {
  129.     if (str == null) {
  130.         return -1;
  131.     }
  132.  
  133.     int start = 0;
  134.     int end = length - 1;
  135.     while (start < end) {
  136.         char temp = str[start];
  137.         str[start] = str[end];
  138.         str[end] = temp;
  139.         end--;
  140.         start++;
  141.     }
  142.     return 0;
  143. }
  144.  
  145. char *_itoa(int number) {
  146.     if (number == 0) {
  147.         return "0\0";
  148.     }
  149.  
  150.     const int MAX_LENGTH = 11;
  151.     char *intstr = (char *)_malloc(MAX_LENGTH);
  152.  
  153.     // check for negative
  154.     _bool isNeg = false;
  155.  
  156.     if (number < 0) {
  157.         isNeg = true;
  158.         int temp = 0;
  159.         __asm__ inline(
  160.             "movl %1 ,%%eax;"
  161.             "neg %%eax;"
  162.             "movl %%eax, %0;"
  163.             : "=r"(temp)
  164.             : "a"(number));
  165.  
  166.         number = temp;
  167.     }
  168.  
  169.     int i = 0;
  170.     while (number != 0 && i < MAX_LENGTH) {
  171.         int temp = number % 10;
  172.         intstr[i] = (temp > 9) ? (temp - 10) + 'a' : temp + '0';
  173.         number /= 10;
  174.         i++;
  175.     }
  176.  
  177.     // fix the negative sign
  178.     if (isNeg == true) {
  179.         intstr[i] = '-';
  180.         i++;
  181.     }
  182.  
  183.     // fix the null terminator
  184.     intstr[i] = '\0';
  185.     int reverse = _reverse(intstr, _strlen(intstr));
  186.  
  187.     if (reverse == -1) {
  188.         return "-1";
  189.     }
  190.  
  191.     return intstr;
  192. }
  193.  
  194. void _read(int fd, char *__restrict __buf, unsigned int count) {
  195.     __asm__ inline("syscall;"
  196.                    : "=S"(__buf)
  197.                    : "a"(SYSREAD), "D"(fd), "d"(count));
  198. }
  199.  
  200. void _write(int fd, const char *buf, unsigned int count) {
  201.     __asm__ inline("syscall;" : : "a"(SYSWRITE), "D"(fd), "d"(count), "S"(buf));
  202. }
  203.  
  204. void _print(const char *str) {
  205.     CHECKNULL(str);
  206.     _write(STDOUT_FILENO, str, _strlen(str));
  207. }
  208.  
  209. void _printn(const char *str, size_t n) {
  210.     CHECKNULL(str);
  211.     _static_assert(n <= _strlen(str), "<size_t>  n  > <size_t> strlen");
  212.     _write(STDOUT_FILENO, str, n);
  213. }
  214.  
  215. void _println(const char *str) {
  216.     CHECKNULL(str);
  217.     _write(STDOUT_FILENO, str, _strlen(str));
  218.     _write(STDOUT_FILENO, "\n", 1);
  219. }
  220.  
  221. void _printf(const char *__restrict __fmt, ...) {
  222.     _va_list ap;
  223.     _va_start(ap, __fmt);
  224.  
  225.     size_t len = _strlen(__fmt);
  226.     size_t i = 0;
  227.  
  228.     for (; i < len; i++) {
  229.         if (__fmt[i] == '%') {
  230.             i++;
  231.             switch (__fmt[i]) {
  232.                 case 'd':
  233.                     _print(_itoa(_va_arg(ap, int)));
  234.                     break;
  235.                 case 'c': {
  236.                     char temp = (char)(_va_arg(ap, int));
  237.                     _printn(&temp, 1);
  238.                     break;
  239.                 }
  240.                 case 's':
  241.                     _print(_va_arg(ap, char *));
  242.                     break;
  243.                 case 'l':
  244.                     _print(_itoa(_va_arg(ap, long)));
  245.                     break;
  246.                 default:
  247.                     _printn(&__fmt[i], 1);
  248.                     break;
  249.             }
  250.         } else if (__fmt[i] != '\0') {
  251.             _printn(&__fmt[i], 1);
  252.         } else if (__fmt[i] == '\0') {
  253.             break;
  254.         }
  255.     }
  256.     _va_end(ap);
  257. }
  258.  
  259. void _start() {
  260.     _printf("hello world\n");
  261.     _exit(0);
  262. }
  263.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement