Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADS 1.2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Romario
соответсвует ли дизасм С строчки?

Код
(*1)
         if ((dw & 0x0FFFFFFFul) == 0x01234567ul) {
           puts0("\n\r _1");    
         } else {
           puts0("\n\r _2");
         }
        
        0x0000012c:    e59f6058    X`..    LDR      r6,0x18c                 ; грузим 0x01234567
        0x00000130:    e1a04000    .@..   MOV      r4,r0                      ; r0,r4 = dw

        0x00000150:    e1a00204    ....    MOV      r0,r4,LSL #4            ; ?????????
        0x00000154:    e1500226    &.P.  CMP      r0,r6,LSR #4            ; ?????????
        0x00000158:    1a000002    ....    BNE      {pc} + 0x10 ; 0x168
        
        0x0000015c:    e28f003c    <...    ADD      r0,pc,#0x3c ; #0x1a0
        0x00000160:    ebfffffe    ....        BL        puts0                        ; "\n\r _1"
        0x00000164:    ea000001    ....    B         {pc} + 0xc    ; 0x170
        0x00000168:    e28f0038    8...    ADD      r0,pc,#0x38 ; #0x1a8
        0x0000016c:    ebfffffe    ....         BL       puts0                        ; "\n\r _2"
        0x00000170:    e28f0038    8...                            
        
        0x0000018c:    01234567    gE#.    DCD    1908874

Особенно интересует строки помеченные "?????????"
дело в том, что я явно задаю переменную dw = 0x01234567ul
и такой код

Код
(*2)
        if (dw == 0x01234567) {
           puts0("\n\r 1");    
        } else {
           puts0("\n\r 2");    
        }


проходит на ура!

забил строчки асма (*1) в асм файле, на дебаггер и правда, сравнение не проходит!
( ADS на макс оптимизации.)


а вот код (*1)при отключенной оптимизации:
Код
        0x0000016c:    e1a04000    .@..   MOV      r4,r0                         // в r0 dw, грузим в r4

        0x00000190:    e1a00204    ....    MOV      r0,r4,LSL #4;            //
        0x00000194:    e59f1034    4...    LDR       r1,0x1d0                   // грузим в r1 0x01234567
        0x00000198:    e1510220     .Q.   CMP      r1,r0,LSR #4
        0x0000019c:    1a000002    ....    BNE      {pc} + 0x10 ; 0x1ac

и сравнение проходит!
строки сравнения отличаются от того что было ранее, баг компилера?

p.s. Самое интересное что в другом(!) месте программы код (*1)
при макс оптимизации дебагом проходился нормально.
Dron_Gus
Точно утверждать не буду, но, по-моему, компилятор вместо маски 0x0FFFFFFF сделал сдвиг на 4 бита, что вообщем-то тоже самое.
SpiritDance
Цитата(Dron_Gus @ Apr 3 2007, 01:54) *
вместо маски 0x0FFFFFFF сделал сдвиг на 4 бита, что вообщем-то тоже самое.

Да ну нафиг.
По вашему получить от числа 0x1234 после такого "маскирования" число 0x0123 это тоже самое что получить 0x0234?
Dainis
0x0000012c: e59f6058 X`.. LDR r6,0x18c ; грузим 0x01234567
0x00000130: e1a04000 .@.. MOV r4,r0 ; r0,r4 = dw

0x00000150: e1a00204 .... MOV r0,r4,LSL #4 ; ?????????
r0=dw << 4 ; r4=0x12345678 r0=0x23456780
0x00000154: e1500226 &.P. CMP r0,r6,LSR #4 ; ?????????
if (r6 == (r0 >> 4) ) ; if (r6 == 0x02345678)

Просто используется оптимизация по возможностим ARM архитектуры.
Romario
ну вобщем баг компилера очевиден, что довольно неприятно. не замечал у него багов ранее.
Dainis
Цитата(Romario @ Apr 3 2007, 10:25) *
ну вобщем баг компилера очевиден, что довольно неприятно. не замечал у него багов ранее.


Я так и непоннал, где же баг ???
Dron_Gus
Цитата(SpiritDance @ Apr 3 2007, 10:10) *
Да ну нафиг.
По вашему получить от числа 0x1234 после такого "маскирования" число 0x0123 это тоже самое что получить 0x0234?




0x00000150: e1a00204 .... MOV r0,r4,LSL #4
0x00000154: e1500226 &.P. CMP r0,r6,LSR #4



Первой командой сдвигаем влево на 4 бита, второй обратно на 4 бита. Т.е. чистим старшие 4 бита. Тоже самое что маска 0x0FFFFFFF. При чем тут 0x0123, равно как и 0x1234 не понял.
SpiritDance
Извиняюсь, сморозил фигню - на код асма недосмотрел
Romario
Цитата(Dainis @ Apr 3 2007, 12:58) *
Я так и непоннал, где же баг ???


я уже запутался с дизасмом и проверками но смысл такой:
вчера целый день убил.
Вот такой код выводил следущее:

Код
   if ((dw & 0x0FFFFFFF) == 0x01234567) {
        puts0("\n\r OK");
   } else {
        puts0("\n\r FU:"); putch0_alw(dw & 0x0FFFFFFF);
   }
   //
   FU: 01234567


спасло введение переменной dw2
Код
        dw2 = 0x01234567;
   if ((dw & 0x0FFFFFFF) == dw2) {
        puts0("\n\r OK");
   }


причем это было только в _конкретном_ месте программы.
Ну на этом я и успокоился.

************************ отредактированно ****************************************



а вот хрен там!

Код
void KAL(u32_t  t) {
   if ((t & 0x0fffffff) == 0x01234567) {
      puts0("\n\r __OK");
   } else {
      puts0("\n\r __FU");
   }
}
...................
...................
extern void KAL(u32_t t);

KAL(0x01234567);
KAL(0x71234567);


выводит
__FU
__FU

в живом проце. Оптимизая O2 time!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.