Перейти к содержанию
    

соответсвует ли дизасм С строчки?

 

(*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)

при макс оптимизации дебагом проходился нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точно утверждать не буду, но, по-моему, компилятор вместо маски 0x0FFFFFFF сделал сдвиг на 4 бита, что вообщем-то тоже самое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вместо маски 0x0FFFFFFF сделал сдвиг на 4 бита, что вообщем-то тоже самое.

Да ну нафиг.

По вашему получить от числа 0x1234 после такого "маскирования" число 0x0123 это тоже самое что получить 0x0234?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 архитектуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну вобщем баг компилера очевиден, что довольно неприятно. не замечал у него багов ранее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну вобщем баг компилера очевиден, что довольно неприятно. не замечал у него багов ранее.

 

Я так и непоннал, где же баг ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да ну нафиг.

По вашему получить от числа 0x1234 после такого "маскирования" число 0x0123 это тоже самое что получить 0x0234?

 

 

 

0x00000150: e1a00204 .... MOV r0,r4,LSL #4

0x00000154: e1500226 &.P. CMP r0,r6,LSR #4

 

 

 

Первой командой сдвигаем влево на 4 бита, второй обратно на 4 бита. Т.е. чистим старшие 4 бита. Тоже самое что маска 0x0FFFFFFF. При чем тут 0x0123, равно как и 0x1234 не понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извиняюсь, сморозил фигню - на код асма недосмотрел

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так и непоннал, где же баг ???

 

я уже запутался с дизасмом и проверками но смысл такой:

вчера целый день убил.

Вот такой код выводил следущее:

 

   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!

Изменено пользователем Romario

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...