Эта функция 8051 ASM так излишне запутана, как мне кажется, или мне чего-то не хватает? - PullRequest
1 голос
/ 11 мая 2019

Я перепроектировал некоторые прошивки, которые я сбросил со встроенного устройства, использующего микроконтроллер 8051.И я наткнулся на эту функцию, которую Гидра разбирает следующим образом:

undefined FUN_CODE_1cff()
       undefined         R7:1           <RETURN>
            FUN_CODE_1cff
  1cff XCH  A,R5
  1d00 MOV  A,R7
  1d01 XCH  A,R5
  1d02 MOV  A,R5
  1d03 MOV  R2,A
  1d04 MOV  A,R6
  1d05 MOV  R7,A
  1d06 MOV  A,R2
  1d07 MOV  R6,A
  1d08 RET

Итак, я думаю, что он делает следующее:

+-------------+----------------+----+----+----+----+----+
| Instruction |  Explanation   | A  | R2 | R5 | R6 | R7 |
+-------------+----------------+----+----+----+----+----+
|             |                | 10 |  2 |  5 |  6 |  7 |
| XCH  A,R5   | Swap A with R5 |  5 |  2 | 10 |  6 |  7 |
| MOV  A,R7   | Copy R7 into A |  7 |  2 | 10 |  6 |  7 |
| XCH  A,R5   | Swap A with R5 | 10 |  2 |  7 |  6 |  7 |
| MOV  A,R5   | Copy R5 into A |  7 |  2 |  7 |  6 |  7 |
| MOV  R2,A   | Copy A into R2 |  7 |  7 |  7 |  6 |  7 |
| MOV  A,R6   | Copy R6 into A |  6 |  7 |  7 |  6 |  7 |
| MOV  R7,A   | Copy A into R7 |  6 |  7 |  7 |  6 |  6 |
| MOV  A,R2   | Copy R2 into A |  7 |  7 |  7 |  6 |  6 |
| MOV  R6,A   | Copy A into R6 |  7 |  7 |  7 |  7 |  6 |
| RET         | Return         |  7 |  7 |  7 |  7 |  6 |
+-------------+----------------+----+----+----+----+----+

Но, похоже, в нем есть куча ненужногошаги.Разве это не было бы намного проще?

+-------------+----------------+----+----+----+----+----+
| Instruction |  Explanation   | A  | R2 | R5 | R6 | R7 |
+-------------+----------------+----+----+----+----+----+
|             |                | 10 |  2 |  5 |  6 |  7 |
| XCH  A,R6   | Swap A with R6 |  6 |  2 |  5 | 10 |  7 |
| XCH  A,R7   | Swap A with R7 |  7 |  2 |  5 | 10 |  6 |
| MOV  R2,A   | Copy A into R2 |  7 |  7 |  5 | 10 |  6 |
| MOV  R5,A   | Copy A into R5 |  7 |  7 |  7 | 10 |  6 |
| MOV  R6,A   | Copy A into R6 |  7 |  7 |  7 |  7 |  6 |
| RET         | Return         |  7 |  7 |  7 |  7 |  6 |
+-------------+----------------+----+----+----+----+----+

И это я, если вы не можете напрямую MOV или XCH между двумя R# регистрами.Я не думаю, что возможность MOV не будет иметь здесь никакого значения, но если вы сможете XCH, то вы можете сбрить еще одну строчку примерно так:

+-------------+-----------------+----+----+----+----+----+
| Instruction |   Explanation   | A  | R2 | R5 | R6 | R7 |
+-------------+-----------------+----+----+----+----+----+
|             |                 | 10 |  2 |  5 |  6 |  7 |
| XCH  R6,R7  | Swap R6 with R7 | 10 |  2 |  5 |  7 |  6 |
| MOV  A,R6   | Copy R6 into A  |  7 |  2 |  5 |  7 |  6 |
| MOV  R2,A   | Copy A into R2  |  7 |  7 |  5 |  7 |  6 |
| MOV  R5,A   | Copy A into R5  |  7 |  7 |  7 |  7 |  6 |
| RET         | Return          |  7 |  7 |  7 |  7 |  6 |
+-------------+-----------------+----+----+----+----+----+

При этомКто-нибудь есть идеи, почему это может быть реализовано так, как это было?Я не думаю, что это было для того, чтобы запутать код - микросхема, из которой я его сбросил ( P87C51RB2BA ), имеет бит «защиты от чтения», который можно установить при программировании, а также возможность иметьон считал зашифрованный код.Я полагаю, что если бы у них была какая-то причина хотеть запутать код, они бы установили один из них, но (к счастью), похоже, что они этого не сделали, так как я смог просто сбросить чип в открытый текст.(Если мой чип не просто " функционирует по ошибке ".) И было бы странно просто запутать эту одну часть в любом случае.

РЕДАКТИРОВАТЬ: Я забыл упомянутьчто рассматриваемая функция вызывается в нескольких местах кода;на самом деле это одна из наиболее часто вызываемых функций, которые я когда-либо видел в этой прошивке.

Вот часть окружающего кода, начиная с другой функции, которая выглядит аналогично запутанной (хотя она и не вызывается так часто,и я не проанализировал его подробно)

                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             undefined FUN_CODE_1cd3()
             undefined         R7:1           
                             FUN_CODE_1cd3                                   XREF[9]:     FUN_CODE_0311:0462(c), 
                                                                                          FUN_CODE_0311:04d8(c), 
                                                                                          FUN_CODE_0311:0604(c), 
                                                                                          FUN_CODE_0dd4:0dd6(c), 
                                                                                          FUN_CODE_0f9b:0fa4(c), 
                                                                                          FUN_CODE_0f9b:0fbd(c), 
                                                                                          ibus_2002_handler:1009(c), 
                                                                                          FUN_CODE_1134:1136(c), 
                                                                                          ibus_3002_handler:116c(c)  
       CODE:1cd3 c8              XCH        A,R0
       CODE:1cd4 ef              MOV        A,R7
       CODE:1cd5 c8              XCH        A,R0
       CODE:1cd6 e6              MOV        A,@R0
       CODE:1cd7 fe              MOV        R6,A
       CODE:1cd8 08              INC        R0
       CODE:1cd9 e6              MOV        A,@R0
       CODE:1cda ff              MOV        R7,A
       CODE:1cdb 12 1c ff        LCALL      FUN_CODE_1cff                                    undefined FUN_CODE_1cff()
       CODE:1cde 22              RET
                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             undefined FUN_CODE_1cdf()
             undefined         R7:1           
                             FUN_CODE_1cdf                                   XREF[2]:     FUN_CODE_0cd4:0da7(c), 
                                                                                          FUN_CODE_1569:158a(c)  
       CODE:1cdf 12 18 4d        LCALL      FUN_CODE_184d                                    undefined FUN_CODE_184d()
       CODE:1ce2 78 6c           MOV        R0,#0x6c
       CODE:1ce4 e6              MOV        A,@R0=>DAT_INTMEM_6c                             = ??
       CODE:1ce5 24 05           ADD        A,#0x5
       CODE:1ce7 f5 2f           MOV        DAT_INTMEM_2f,A                                  = ??
       CODE:1ce9 22              RET
                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             undefined FUN_CODE_1cea()
             undefined         R7:1           
                             FUN_CODE_1cea                                   XREF[1]:     FUN_CODE_165c:16b1(c)  
       CODE:1cea e5 1d           MOV        A,BANK3_R5                                       = ??
       CODE:1cec 60 06           JZ         LAB_CODE_1cf4
       CODE:1cee 12 1c 70        LCALL      FUN_CODE_1c70                                    undefined FUN_CODE_1c70()
       CODE:1cf1 12 1b d5        LCALL      FUN_CODE_1bd5                                    undefined FUN_CODE_1bd5()
                             LAB_CODE_1cf4                                   XREF[1]:     CODE:1cec(j)  
       CODE:1cf4 22              RET
                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             undefined FUN_CODE_1cf5()
             undefined         R7:1           
                             FUN_CODE_1cf5                                   XREF[3]:     FUN_CODE_0311:0520(c), 
                                                                                          FUN_CODE_0311:0611(c), 
                                                                                          FUN_CODE_1569:15b2(c)  
       CODE:1cf5 e5 2d           MOV        A,DAT_INTMEM_2d                                  = ??
       CODE:1cf7 04              INC        A
       CODE:1cf8 ff              MOV        R7,A
       CODE:1cf9 30 e7 02        JNB        ACC.7,LAB_CODE_1cfe                              = ??
       CODE:1cfc 7f 01           MOV        R7,#0x1
                             LAB_CODE_1cfe                                   XREF[1]:     CODE:1cf9(j)  
       CODE:1cfe 22              RET
                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             undefined FUN_CODE_1cff()
             undefined         R7:1           
                             FUN_CODE_1cff                                   XREF[23]:    FUN_CODE_0cd4:0cf2(c), 
                                                                                          FUN_CODE_0cd4:0d17(c), 
                                                                                          FUN_CODE_0cd4:0d23(c), 
                                                                                          FUN_CODE_0cd4:0d2f(c), 
                                                                                          FUN_CODE_0cd4:0d3b(c), 
                                                                                          FUN_CODE_0cd4:0d61(c), 
                                                                                          FUN_CODE_0dd4:0e46(c), 
                                                                                          FUN_CODE_1068:10d9(c), 
                                                                                          FUN_CODE_1068:10f6(c), 
                                                                                          ibus_3004_handler:1190(c), 
                                                                                          ibus_3004_handler:11b5(c), 
                                                                                          ibus_3004_handler:11c1(c), 
                                                                                          ibus_3004_handler:11cd(c), 
                                                                                          ibus_3004_handler:11d9(c), 
                                                                                          FUN_CODE_184d:1861(c), 
                                                                                          FUN_CODE_184d:1886(c), 
                                                                                          FUN_CODE_1988:1996(c), 
                                                                                          FUN_CODE_1988:19b4(c), 
                                                                                          FUN_CODE_1a5c:1a63(c), 
                                                                                          FUN_CODE_1a5c:1a76(c), [more]
       CODE:1cff cd              XCH        A,R5
       CODE:1d00 ef              MOV        A,R7
       CODE:1d01 cd              XCH        A,R5
       CODE:1d02 ed              MOV        A,R5
       CODE:1d03 fa              MOV        R2,A
       CODE:1d04 ee              MOV        A,R6
       CODE:1d05 ff              MOV        R7,A
       CODE:1d06 ea              MOV        A,R2
       CODE:1d07 fe              MOV        R6,A
       CODE:1d08 22              RET
                             LAB_CODE_1d09                                   XREF[1]:     CODE:1cc2(j)  
       CODE:1d09 7b 01           MOV        R3,#0x1
       CODE:1d0b 7a 00           MOV        R2,#0x0
       CODE:1d0d 02 1b 12        LJMP       LAB_CODE_1b12
                             DAT_CODE_1d10                                   XREF[1]:     start:152a(R)  
       CODE:1d10 01              undefined1 01h
                             DAT_CODE_1d11                                   XREF[1]:     start:1538(R)  
       CODE:1d11 1b              undefined1 1Bh
                             DAT_CODE_1d12                                   XREF[3]:     start:14ed(R), start:14ff(R), 
                                                                                          start:1547(R)  
       CODE:1d12 00              undefined1 00h
                             DAT_CODE_1d13                                   XREF[4]:     start:14f1(R), start:14ff(R), 
                                                                                          start:152a(R), start:154b(R)  
       CODE:1d13 01              undefined1 01h
                             DAT_CODE_1d14                                   XREF[3]:     start:14f1(R), start:152a(R), 
                                                                                          start:154f(R)  
       CODE:1d14 1f              undefined1 1Fh
                             DAT_CODE_1d15                                   XREF[2]:     start:152a(R), start:154f(R)  
       CODE:1d15 08              undefined1 08h
       CODE:1d16 00              ??         00h

РЕДАКТИРОВАТЬ 2: Данное устройство представляет собой портативное устройство программирования для панелей сигнализации Brinks, такое же, как в мое видео здесь .

1 Ответ

2 голосов
/ 12 мая 2019

Путем некоторой догадки (см. Комментарии) мы пришли к выводу, что

FUN_CODE_1cff
  1cff XCH  A,R5
  1d00 MOV  A,R7
  1d01 XCH  A,R5
  1d02 MOV  A,R5
  1d03 MOV  R2,A
  1d04 MOV  A,R6
  1d05 MOV  R7,A
  1d06 MOV  A,R2
  1d07 MOV  R6,A
  1d08 RET

, скорее всего, является функцией преобразования с прямым порядком байтов в обратный порядок байтов, сгенерированной неоптимизирующим компилятором.В Си это будет выглядеть примерно так:

uint16_t Convert16_BE2LE(uint16 var)
{
   uint16_t retVal;

   retVal = ((var & 0x00FF) << 8) | ((var & 0xFF00) >> 8);
   return retVal;
}

R5, R2 используются компилятором в качестве чистых регистров.

Как я упоминал в одном из комментариев, еще в 2000-2005 гг.работал с компилятором ccz80 от Wind River, который дал аналогичные результаты с точки зрения оптимизации.Это в значительной степени просто переведет конкретную конструкцию C в фиксированную последовательность кодов операций.В результате код оказался верным, но выглядел ужасно неоптимальным для тех, кто привык к программированию ассемблера вручную.С другой стороны, это позволило компилятору быть дешевым, крошечным (~ 150-200 КБ) и очень быстрым.

...