Няшная / Говнокод #28054 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 kcalbCube, (Updated )

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

  • блять тут ещё и везде структуры через {} инициализируются
    Ответить
  • поебался чуток, но таки получилось что-то.
    скормил этой хуйне
    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 на следующую строчку, он что, ебанутый?
      Ответить
      • Неоптимизированная кодогенерация. Генерируется прыжок на метку, а где физически эта метка будет — неизвестно. Может, на следующей строчке. Может — между этой меткой и джампом ещё парочка будет.
        Ответить
          • А нахуя ей знать? Высрала мнемонику и хватит, дальше пусть ассемблер разбирается.
            Ответить
    • 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
      Ответить
            • я просто не хочу размер int переопределять, а ко всем литералам (uint16_t) или тем более (unsigned short) приписывать утомительно.
              Ответить
              • Это какой-то свой конпелятор?

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

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

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8