Говнокод по пятницам. Эпизод 2. Перверсивное реверсирование

Да, Господь с Вами …

Блин, пошел опять искать пепел ))

Можно пару ардуин спалить не сходя с места, чтобы не искать…

Там пепла нет, весь пепел от чего? От дыма! А когда ардуины горят - весь дым выходит…

На работе я, тут ничего палить не разрешают ))

Чтобы преднамеренно написать качественный говнокод - это талант нужен или озарение.

А что касается других кодов (не использующих таблицы), то если скомбинировать # 19 и # 24 то можно получить код, который будет на 1 такт быстрее и соответственно 2 байта короче кода #24

            SWAP  R24
            MOV   R25,R24
            ROL   R24
            ROR   R25
            ROL   R24
            ROR   R25
            ROL   R24
            ROR   R25
            ROL   R24
            ROR   R25
            ROL   R24
            ANDI  R24, $0F
            ANDI  R25, $F0            
            OR    R24,R25

Полазил по инету и нашел код который еще на 1 такт быстрее (итого на 2 такта быстрее и на 4 байта меньше чем #24

          MOV   R25, R24
          ASR    R25
          ROR    R24
          ROL    R25
          ROL    R25
          ANDI   R24, $AA
          ANDI   R25, $55
          OR     R24, R25
          MOV    R25, R24
          ANDI   R24, $99
          ANDI   R25, $66
          SWAP   R25
          OR     R24, R25

А что касается говнокода - есть такая идея:
Преобразуем байт в строку битов, затем с помощью выделения подстрок и конкатенации переставляем символы, после чего опять делаем из этой строки байт. Писать код не хочу, ибо несмотря на то, что оно ужасно и прикольно, в то же время оно все равно бессмысленно.

Мля, что-то зацепило. Мозг сам задумался и я его не смог отвлечь. Получилось такое:

 MOV	R25, R24
	ANDI	R24, $66
	EOR	    R25, R24
	SWAP	R24
	OR	    R24, R25
	ROR	    R25
	MOV	    R25, R24
	ANDI 	R24, $AA
	EOR 	R25, R24
	ROR	    R25
	ADD	    R24, R24
	ADC	    R24, R25

В итоге это уже на 3 такта быстрее и на 6 байтов меньше, чем #24
(если считать с вызовом и возвратом, то будет 20 тактов и 26 байт)

Эх, Командира на тебя нет, на параплане летает )))

У меня #24 почему-то не заработал

P.S. Разобрался с “кракозябрами” asm для GCC))
Всё работает, если немного изменить

Спойлер
uint8_t __attribute__((noinline)) rb(uint8_t b) {
  uint8_t r;
  asm volatile (
    "SWAP %0 \n\t"
    "MOV %1, %0 \n\t"
    "ANDI %1,0xCC \n\t"
    "LSR %1 \n\t"
    "LSR %1 \n\t"
    "ANDI %0,0x33 \n\t"
    "LSL %0 \n\t"
    "LSL %0 \n\t"
    "OR %0,%1 \n\t"
    "MOV %1,%0 \n\t"
    "ANDI %1,0xAA \n\t"
    "LSR %1 \n\t"
    "ANDI %0,0x55 \n\t"
    "LSL %0 \n\t"
    "OR %0,%1 \n\t"
    : "=&r" (r)
    : "r" (b)
    );
  return r;
}