1. Си / Говнокод #28054

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    typedef enum {
      FILE_NONE, FILE_C, FILE_ASM, FILE_OBJ, FILE_AR, FILE_DSO,
    } FileType;
    
    StringArray include_paths;
    bool opt_fcommon = true;
    bool opt_fpic;
    
    static FileType opt_x;
    static StringArray opt_include;
    static bool opt_E;
    static bool opt_M;
    static bool opt_MD;
    static bool opt_MMD;
    static bool opt_MP;
    static bool opt_S;
    static bool opt_c;
    static bool opt_cc1;
    static bool opt_hash_hash_hash;
    static bool opt_static;
    static bool opt_shared;
    static char *opt_MF;
    static char *opt_MT;
    static char *opt_o;
    
    static StringArray ld_extra_args;
    static StringArray std_include_paths;
    
    char *base_file;
    static char *output_file;
    
    static StringArray input_paths;
    static StringArray tmpfiles;

    благо поиск по проекту работает

    Запостил: kcalbCube, 25 Февраля 2022

    Комментарии (23) RSS

    • блять тут ещё и везде структуры через {} инициализируются
      Ответить
      • программа работает модульно, модули выполнены в виде флагов, с которыми программа себя форкает.
        вот и поэтому я за "C++"
        Ответить
      • Ну и правильно делают.
        Ответить
      • А как надо?
        Ответить
    • поебался чуток, но таки получилось что-то.
      скормил этой хуйне
      int main(void)
      {
      	*((unsigned short*)(0x100us)) = 10us;
      	return 1;
      }


      получил
      main:
        push %bp
        mov %bp %sp
        sub %sp 0010h
        mov [%bp + FFFEh] %sp
        mov %a 0100h
        push %a
        mov %a 000Ah
        pop %si
        mov [%si] %a
        mov %a 0001h
        jmp .L.return.main
      .L.return.main:
        int 0h
      Ответить
      • А зачем делать jmp на следующую строчку, он что, ебанутый?
        Ответить
        • Неоптимизированная кодогенерация. Генерируется прыжок на метку, а где физически эта метка будет — неизвестно. Может, на следующей строчке. Может — между этой меткой и джампом ещё парочка будет.
          Ответить
          • Дегенерация должна бы знать, какой jmp выдавать short или far
            Ответить
            • А нахуя ей знать? Высрала мнемонику и хватит, дальше пусть ассемблер разбирается.
              Ответить
      • void main(void)
        {
            *((unsigned short*)((void*)0x100us)) = 10us + 5us;
        }
        
        void _start(void)
        {
            asm("mov %sp FFFFh");
            main();
            asm("mov %a [100h]");
        }

        _start:
          mov %sp FFFFh
          call @main
          mov %a [100h]
        .return._start:
          int 0h
        main:
          push %bp
          mov %bp %sp
          sub %sp 0010h
          mov [%bp + FFFEh] %sp
          mov %a 0100h
          push %a
          mov %a 0005h
          push %a
          mov %a 000Ah
          pop %si
          add %a %si
          pop %si
          mov [%si] %a
        .return.main:
          mov %sp %bp
          pop %bp
          ret

        37 microseconds 0 (ms) elapsed
        A 000F
        B 0000
        C 0000
        D 0000
        E 0000
        SI 0100
        BP 0000
        SP FFFF
        IP 008E
        Ответить
        • > 10us

          Почему всё в микросекундах?
          Ответить
          • это unsigned short
            Ответить
            • Такое бывает? Или это какая-то своя сишка?
              Ответить
              • я просто не хочу размер int переопределять, а ко всем литералам (uint16_t) или тем более (unsigned short) приписывать утомительно.
                Ответить
                • Это какой-то свой конпелятор?

                  Сишка, к примеру, в выражении uint16_t x = a + b где a и b тоже uint16_t перед сложением сконвертит их в int, а после сложения обрежет результат до uint16_t.

                  Т.е. в обычной сишке писать short на литералах бесполезно. Они всё равно сразу же растянутся.
                  Ответить
                  • да, chibicc.
                    я убрал расширение до int.
                    Ответить
                    • простой очень компилятор, легко модифицировать
                      Ответить
    • >> opt_hash_hash_hash
      Хаш_хаш_хаш...
      Ответить

    Добавить комментарий