Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюки IAR ARM 5.4
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ytrnj
Привет всем!

Неожиданно проявилась проблема с IAR.
После перехода на версию 5.4 Full девайс на LPC1766 стал глючить.
Оптимизация - High/Balanced.

Анализ выявил следующее.

Заглючила строка сравнивающая старшее и младшее слово
Код
INT32U kc=key_code;  // key_code тоже INT32U
  if(!(0xFFFF&(kc^(kc>>16)))) {...}

Компилятор породил следущий код
Код
\   0000013C   080C               LSRS     R0,R1,#+16 // в R1 находится kc
\   0000013E   91EA000F           TEQ      R1,R0
\   00000142   4DD1               BNE.N    ??__int_display_2

Очевидно, что 0xFFFF проигнорирован напрочь.
Простая перестановка его в конец ничего не изменила.
Однако, после некоторых манипуляций, конструкция была изменена на
Код
   if((0xFFFF&kc)==(kc>>16)){...}


Что породило уже рабочую последовательность
Код
\   0000013C   88B2               UXTH     R0,R1 // в R1 находится kc
\   0000013E   B0EB114F           CMP      R0,R1, LSR #+16
\   00000142   4DD1               BNE.N    ??__int_display_2


Я, конечно, понимаю, что в IAR люди работают и ничего человеческое им не чуждо.
Посмотрел на сайте и скачал Evalution версии 5.41, однако ничего не изменилось!!!!
На мой взгляд, оба варианта сравнения идентичны по сути.
Может быть первоначальный вариант и не столь очевиден, НО компилятора это не должно касаться.
Такого рода конструкций в проге куча.
Что же теперь, всё перепроверять на понятность и адекватность компилятора?
Печально, но я IARу раньше доверял как родному.

Суть вопроса - версию 5.4 в топку или я чего-то не не понимаю?

Заранее благодарен.
Ytrnj
Доброго времени суток.

Посмотрел в старой копии, что генерировал 5.3.

В R3 находится значение kc.
Код
\   0000012A   83EA1342           EOR      R2,R3,R3, LSR #+16
\   0000012E   92B2               UXTH     R2,R2
\   00000130   002A               CMP      R2,#+0
\   00000132   54D1               BNE.N    ??__int_display_3


Немного длиннее, но, главное, все корректно. Следовательно в 5.4 "улучшили" чего-то.
Учитывая, что у меня trial, писать в IAR бесполезно,
а с моим знанием английского ещё и безсмысленно.

Так что, любители новых версий IAR будьте осторожны - не выбрасывайте 5.3.

Удачи!
zltigo
Цитата(Ytrnj @ Jan 18 2010, 17:35) *
Такого рода конструкций в проге куча.

"Такого рода конструкций" у меня ни одной - можно я выброшу 5.3 компилятор???
KRS
А вы уверены в правильности своего кода?
Дело в том что для INT32 операция сдвига вправо расширяет знак!
т.е.
если ks = 0x80008000
то условие
if((0xFFFF&kc)==(kc>>16))
не выполнится
0x8000 != 0xFFFF8000
---------------
Не все ок!
не заметил букву U в конце типа! Обычно ее в начале ставят
Сергей Борщ
Цитата(KRS @ Jan 18 2010, 23:40) *
Дело в том что для INT32 операция сдвига вправо расширяет знак!
Согласно стандарту результат операции сдвига вправа отрицательного числа вообще отдан на откуп компилятору. Сам был немало удивлен.

Я тоже подумал об этой причине, но в последний момент успел заметить U.
KRS
действительно с XORом какой то глюк! При проверке на 0
Код
volatile int beep;
void test1(unsigned a)
{
    if ((a ^ (a >> 16)) & 0xffff)
        beep = 1;
}

void test2(unsigned a)
{
    if ((a ^ (a >> 1)) & 0xffff)
        beep = 1;
}

unsigned test3(unsigned a)
{
    return ((a ^ (a >> 16)) & 0xffff);

}

void test4(unsigned a, unsigned b)
{
    if ((a ^ (b >> 16)) & 0xffff)
        beep = 1;
}

void test5(unsigned a, unsigned b)
{
    if ((a ^ (b >> 1)) & 0xffff)
        beep = 1;
}

void test6(unsigned a, unsigned b)
{
    if (((a & 0xffff) ^ (b >> 16)))
        beep = 1;
}

void test7(unsigned a)
{
    if (((a & 0xffff) ^ (a >> 16)))
        beep = 1;
}

void test8(unsigned a)
{
    if (((a & 0xffff) ^ (a >> 1)))
        beep = 1;
}

void test9(unsigned a, unsigned b)
{
    if (((a & 0xffff) ^ (b >> 1)))
        beep = 1;
}


Все эти функции кроме 3, 8, 9
компилируются с ошибкой!

Код
      2          void test1(unsigned a)
      3          {
      4              if ((a ^ (a >> 16)) & 0xffff)
   \                     test1:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test1_0
      5                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
      6          }
   \                     ??test1_0:
   \   0000000E   7047               BX       LR              ;; return
      7          

   \                                 In section .text, align 2, keep-with-next
      8          void test2(unsigned a)
      9          {
     10              if ((a ^ (a >> 1)) & 0xffff)
   \                     test2:
   \   00000000   4108               LSRS     R1,R0,#+1
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test2_0
     11                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     12          }
   \                     ??test2_0:
   \   0000000E   7047               BX       LR              ;; return
     13          

   \                                 In section .text, align 2, keep-with-next
     14          unsigned test3(unsigned a)
     15          {
     16              return ((a ^ (a >> 16)) & 0xffff);
   \                     test3:
   \   00000000   80EA1040           EOR      R0,R0,R0, LSR #+16
   \   00000004   80B2               UXTH     R0,R0
   \   00000006   7047               BX       LR              ;; return
     17          
     18          }
     19          

   \                                 In section .text, align 2, keep-with-next
     20          void test4(unsigned a, unsigned b)
     21          {
     22              if ((a ^ (b >> 16)) & 0xffff)
   \                     test4:
   \   00000000   090C               LSRS     R1,R1,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test4_0
     23                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     24          }
   \                     ??test4_0:
   \   0000000E   7047               BX       LR              ;; return
     25          

   \                                 In section .text, align 2, keep-with-next
     26          void test5(unsigned a, unsigned b)
     27          {
     28              if ((a ^ (b >> 1)) & 0xffff)
   \                     test5:
   \   00000000   4908               LSRS     R1,R1,#+1
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test5_0
     29                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     30          }
   \                     ??test5_0:
   \   0000000E   7047               BX       LR              ;; return
     31          

   \                                 In section .text, align 2, keep-with-next
     32          void test6(unsigned a, unsigned b)
     33          {
     34              if (((a & 0xffff) ^ (b >> 16)))
   \                     test6:
   \   00000000   090C               LSRS     R1,R1,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test6_0
     35                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     36          }
   \                     ??test6_0:
   \   0000000E   7047               BX       LR              ;; return
     37          

   \                                 In section .text, align 2, keep-with-next
     38          void test7(unsigned a)
     39          {
     40              if (((a & 0xffff) ^ (a >> 16)))
   \                     test7:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test7_0
     41                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     42          }
   \                     ??test7_0:
   \   0000000E   7047               BX       LR              ;; return
     43          

   \                                 In section .text, align 2, keep-with-next
     44          void test8(unsigned a)
     45          {
     46              if (((a & 0xffff) ^ (a >> 1)))
   \                     test8:
   \   00000000   81B2               UXTH     R1,R0
   \   00000002   91EA500F           TEQ      R1,R0, LSR #+1
   \   00000006   02D0               BEQ.N    ??test8_0
     47                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     48          }
   \                     ??test8_0:
   \   0000000E   7047               BX       LR              ;; return
     49          

   \                                 In section .text, align 2, keep-with-next
     50          void test9(unsigned a, unsigned b)
     51          {
     52              if (((a & 0xffff) ^ (b >> 1)))
   \                     test9:
   \   00000000   80B2               UXTH     R0,R0
   \   00000002   90EA510F           TEQ      R0,R1, LSR #+1
   \   00000006   02D0               BEQ.N    ??test9_0
     53                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     54          }
   \                     ??test9_0:
   \   0000000E   7047               BX       LR              ;; return
RabidRabbit
Цитата(Ytrnj @ Jan 18 2010, 21:02) *
Учитывая, что у меня trial, писать в IAR бесполезно,
а с моим знанием английского ещё и безсмысленно.


Извиняюсь за оффтопик, но например с KEIL я отправил багрепорт в их техподдержку (в заявке S/N продукта = EVALUATION) на своём корявом английском - так ничего, прислали DLL'ку с пофиксенным багом smile.gif Они ведь тоже люди wink.gif
Ytrnj
Цитата(KRS @ Jan 19 2010, 03:00) *
действительно с XORом какой то глюк! При проверке на 0
...
Все эти функции кроме 3, 8, 9
компилируются с ошибкой!
...

Фундаментальный подход. Внушает.
Убедился - не в моих руках дело.
Сношу 5.4 и жду 5.5.

Спасибо всем, кто откликнулся.
KRS - персональное "БОЛЬШОЕ СПАСИБО".

Мне кажется, это серьезная проблема для IAR. Странно, если они о ней ещё не знают.
После скачивания Evalution на мыло пришло какое-то сообщение от IAR,
можно в ответ послать им письмо с примерами от KRS (если KRS не возражает).

Удачи всем.
IgorKossak
Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?
Сергей Борщ
Цитата(IgorKossak @ Jan 19 2010, 09:51) *
Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?
А почему она должна быть расширена? Она без модификатора, значит int. Int у ARM 32-битный.
IgorKossak
Цитата(Сергей Борщ @ Jan 19 2010, 10:23) *
А почему она должна быть расширена? Она без модификатора, значит int. Int у ARM 32-битный.

Это проверено или из области предположений (надо сказать, логичных)?
Что в этом случае говорит стандарт?
К сожалению, у меня сейчас не установлен IAR, чтобы проверить 0xffffffffUL.
KRS
Цитата(IgorKossak @ Jan 19 2010, 10:51) *
Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?

Это почему может быть? такие константы по стандарту unsigned ( если тип int 16 битный) а если 32 битный то без разницы.
К тому же как видно по операции присваивания этого выражения, никакого расширения знака не происходит!
Глюк именно с XORом с проверкой на 0. Может быть ноги растут с 16 разрядной платформы - компилер считатет что старшие 16 бит и так 0.
IgorKossak
Проверяли только XOR или другие операции тоже?
KRS
Цитата(IgorKossak @ Jan 19 2010, 12:22) *
Проверяли только XOR или другие операции тоже?

Другие вроде ок! Да и с XOR ок, только проверка на 0 глючит!
А такой код
Код
if ((a ^ (a >> 16)) & 0xffff)
    return (a ^ (a >> 16)) & 0xffff;

вообще смешно компилируется!
Проверка остается кривой, потом выражение почти заново считается для возврата.

Код
      1          unsigned test(unsigned a) {
      2           if ((a ^ (a >> 16)) & 0xffff)
   \                     test:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test_0
      3              return (a ^ (a >> 16)) & 0xffff;
   \   00000008   4840               EORS     R0,R1,R0
   \   0000000A   80B2               UXTH     R0,R0
   \   0000000C   7047               BX       LR
      4           return 1;
   \                     ??test_0:
   \   0000000E   0120               MOVS     R0,#+1
   \   00000010   7047               BX       LR              ;; return
      5          }
Сергей Борщ
Цитата(IgorKossak @ Jan 19 2010, 10:56) *
Это проверено или из области предположений (надо сказать, логичных)?
Проверено что? Константа без модификатора согласно стандарта считается int. Int у ARM 32-битный точно.
Нажмите для просмотра прикрепленного файла
KRS
Цитата(Сергей Борщ @ Jan 19 2010, 14:28) *
Константа без модификатора согласно стандарта считается int. Int у ARM 32-битный точно.

Не всегда! восьмиричные и шестнадцетиричные могут быть и unsigned, например если целое 16 бит то 0x7ffff - int, a 0x8000 уже unsigned, 0x7fffffff - long int, а 0x80000000 - unsigned long int и т.д. Для 32 битного int аналогично.
Сергей Борщ
Цитата(KRS @ Jan 19 2010, 13:44) *
Не всегда!
Да, действительно. Правильнее было наприсать "минимум int".
_4afc_
Цитата(IgorKossak @ Jan 19 2010, 10:51) *
Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?


Вы намикаете, что надо писать 0x0000ffff или 0xffffUL вместо 0xffff?
IgorKossak
Цитата(_4afc_ @ Jan 19 2010, 17:14) *
Вы намикаете, что надо писать 0x0000ffff или 0xffffUL вместо 0xffff?

Именно, немного ошибся в количестве f, но сути дела это не меняет. По крайней мере 0xffffUL переносимо.
MALLOY2
Да это баг для Cortex-M3, на других ядрах работает нормально.
KRS
Цитата(MALLOY2 @ Jan 19 2010, 19:16) *
Да это баг для Cortex-M3, на других ядрах работает нормально.

Ну да! Так под кортекс оптимизировать намного сложнее! Система комнад более гибкая, надо выбирать опрадвана ли будет 32 битная команда, еще IT блоки есть...
Alechek
Тема про компилятор 5.40 или 5.41?
Я было плевался от 5.30 версии с ее оптимизцией (под ARM), думал тему создавать... А в 5.40 все поправили!
MALLOY2
Цитата
Тема про компилятор 5.40 или 5.41

Я тестировал в 5.40 думаю в 5.41 тоже самое

Цитата
Я было плевался от 5.30 версии с ее оптимизацией ...

Поточнее что вам не нравилось в 5.30 ?

Цитата
Ну да! Так под кортекс оптимизировать ....

На Cortex-M0 работает правильно smile.gif
ю
Так маляву накатали в IAR? по гуглил инет нигде больше этот баг не обсуждается.
Ytrnj
Цитата(MALLOY2 @ Jan 20 2010, 10:25) *
Так маляву накатали в IAR? по гуглил инет нигде больше этот баг не обсуждается.


Письмо послано. Только не думаю, что быстро ответят.
Признавать ошибки - дело не легкое, да и неприятное.
IgorKossak
Цитата(Ytrnj @ Jan 20 2010, 09:16) *
Письмо послано. Только не думаю, что быстро ответят.
Признавать ошибки - дело не легкое, да и неприятное.

Это точно, на мой баг репорт четыре года отвечали.
KRS
Цитата(MALLOY2 @ Jan 20 2010, 09:25) *
Я тестировал в 5.40 думаю в 5.41 тоже самое

Да тоже самое! Я и 5.40 и последним 5.41 (январским)
Alechek
Цитата(MALLOY2 @ Jan 20 2010, 11:25) *
Поточнее что вам не нравилось в 5.30 ?

Переключение THUMB/ARM.
Ytrnj
Ну что, IAR ответил smile3046.gif .

Следует отметить, что достаточно быстро.
Правда пришлось два письма посылать.
В первом, или я плохо объяснил, или он не напрягся, что бы понять.
Но на второе, более подробное, ответ пришел через час и представлен Вашему вниманию.

Цитата
Dear Alexander,

sorry, I missed that, you are perfectly right. Input of the kind 0x11221122
will erronously generate a zero.

I will file this as a bugreport and come back to you as soon as I know more,
but I guess this will be fixed in v5.50 that is scheduled for late April.

Thanks for reporting this bug.

Best regards,
Hans


Итак, кому дороги время и репутация, 5.4 в топку.
Если пришлют патчи, то выложу.
А пока ждем 5.5.
KRS
Цитата(Ytrnj @ Jan 21 2010, 18:48) *
sorry, I missed that, you are perfectly right. Input of the kind 0x11221122
will erronously generate a zero.

Что то я не понял, как это относится к обсуждаемому здесь коду.
Ytrnj
Цитата(KRS @ Jan 21 2010, 20:14) *
Что то я не понял, как это относится к обсуждаемому здесь коду.

Я так понимаю, он не анализировал код,
а просто присваивал какие-то значения и,
в лучшем случае, в симуляторе смотрел результат.
MALLOY2
В версии 5.41.2 баги исправлены!!!!

Код
///////////////////////////////////////////////////////////////////////////////
//                                                                            /
// IAR ANSI C/C++ Compiler V5.41.2.51793/W32 for ARM    25/Feb/2010  15:42:47 /
// Copyright (C) 1999-2010 IAR Systems AB.                                    /
//                                                                            /
//    Cpu mode     =  thumb                                                   /
//    Endian       =  little                                                  /
//    Source file  =  D:\test\main.c                                          /
//    Command line =  D:\test\main.c -lCN D:\test\Debug\List\ -lB             /
//                    D:\test\Debug\List\ -o D:\test\Debug\Obj\ --no_inline   /
//                    --debug --endian=little --cpu=Cortex-M3 -e --fpu=None   /
//                    --dlib_config "C:\Program Files\IAR Systems\Embedded    /
//                    Workbench 5.4\arm\INC\DLib_Config_Normal.h" -I          /
//                    "C:\Program Files\IAR Systems\Embedded Workbench        /
//                    5.4\arm\INC\" -Oh                                       /
//    List file    =  D:\test\Debug\List\main.s                               /
//                                                                            /
//                                                                            /
///////////////////////////////////////////////////////////////////////////////

        NAME main

        PUBLIC beep
        PUBLIC main
        PUBLIC test1
        PUBLIC test10
        PUBLIC test2
        PUBLIC test3
        PUBLIC test4
        PUBLIC test5
        PUBLIC test6
        PUBLIC test7
        PUBLIC test8
        PUBLIC test9

// D:\test\main.c
//    1

        SECTION `.bss`:DATA:NOROOT(2)
//    2 volatile int beep;
beep:
        DS8 4

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//    3 __root void test1(unsigned a)
//    4 {
//    5     if ((a ^ (a >> 16)) & 0xffff)
test1:
        B.N      ?Subroutine0
//    6         beep = 1;
//    7 }
//    8

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//    9 __root void test2(unsigned a)
//   10 {
//   11     if ((a ^ (a >> 1)) & 0xffff)
test2:
        EOR      R0,R0,R0, LSR #+1
        B.N      ??Subroutine0_0
//   12         beep = 1;
//   13 }
//   14

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//   15 __root unsigned test3(unsigned a)
//   16 {
//   17     return ((a ^ (a >> 16)) & 0xffff);
test3:
        EOR      R0,R0,R0, LSR #+16
        UXTH     R0,R0
        BX       LR              ;; return
//   18
//   19 }
//   20

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//   21 __root void test4(unsigned a, unsigned b)
//   22 {
//   23     if ((a ^ (b >> 16)) & 0xffff)
test4:
        EOR      R0,R0,R1, LSR #+16
        B.N      ??Subroutine0_0
//   24         beep = 1;
//   25 }
//   26

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//   27 __root void test5(unsigned a, unsigned b)
//   28 {
//   29     if ((a ^ (b >> 1)) & 0xffff)
test5:
        EOR      R0,R0,R1, LSR #+1
        B.N      ??Subroutine0_0
//   30         beep = 1;
//   31 }
//   32

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//   33 __root void test6(unsigned a, unsigned b)
//   34 {
//   35     if (((a & 0xffff) ^ (b >> 16)))
test6:
        EOR      R0,R0,R1, LSR #+16
        B.N      ??Subroutine0_0
//   36         beep = 1;
//   37 }
//   38

        SECTION `.text`:CODE:ROOT(2)
        THUMB
//   39 __root void test7(unsigned a)
//   40 {
//   41     if (((a & 0xffff) ^ (a >> 16)))
test7:
        REQUIRE ?Subroutine0
       ;; // Fall through to label ?Subroutine0

        SECTION `.text`:CODE:NOROOT(1)
        THUMB
?Subroutine0:
        EOR      R0,R0,R0, LSR #+16
??Subroutine0_0:
        UXTH     R0,R0
        CBZ      R0,??Subroutine0_1
        LDR.N    R0,??DataTable1 ;; beep
        MOVS     R1,#+1
        STR      R1,[R0, #+0]
??Subroutine0_1:
        BX       LR              ;; return
//   42         beep = 1;
//   43 }
//   44

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//   45 __root void test8(unsigned a)
//   46 {
//   47     if (((a & 0xffff) ^ (a >> 1)))
test8:
        UXTH     R1,R0
        TEQ      R1,R0, LSR #+1
        B.N      ?Subroutine1
//   48         beep = 1;
//   49 }
//   50

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//   51 __root void test9(unsigned a, unsigned b)
//   52 {
//   53     if (((a & 0xffff) ^ (b >> 1)))
test9:
        UXTH     R0,R0
        TEQ      R0,R1, LSR #+1
        REQUIRE ?Subroutine1
       ;; // Fall through to label ?Subroutine1
//   54         beep = 1;
//   55 }

        SECTION `.text`:CODE:NOROOT(1)
        THUMB
?Subroutine1:
        BEQ.N    ??Subroutine1_0
        LDR.N    R0,??DataTable1 ;; beep
        MOVS     R1,#+1
        STR      R1,[R0, #+0]
??Subroutine1_0:
        BX       LR              ;; return

        SECTION `.text`:CODE:NOROOT(2)
        DATA
??DataTable1:
        DC32     beep
//   56

        SECTION `.text`:CODE:ROOT(1)
        THUMB
//   57 __root unsigned  test10(unsigned a)
//   58 {
//   59   if ((a ^ (a >> 16)) & 0xffff)  return (a ^ (a >> 16)) & 0xffff;
test10:
        LSRS     R1,R0,#+16
        EOR      R2,R1,R0
        UXTH     R2,R2
        CBZ      R2,??test10_0
        EORS     R0,R1,R0
        UXTH     R0,R0
        BX       LR
//   60   else return 0;
??test10_0:
        MOVS     R0,#+0
        BX       LR              ;; return
//   61 }
//   62

        SECTION `.text`:CODE:NOROOT(1)
        THUMB
//   63 void main()
//   64 {
//   65       while(1);
main:
??main_0:
        B.N      ??main_0
//   66 }

        END
//
//   4 bytes in section .bss
// 100 bytes in section .text
//
// 100 bytes of CODE memory
//   4 bytes of DATA memory
//
//Errors: none
//Warnings: none
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.