реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ADS 1.2, кто знает хорошо асм? баг компилера?
Romario
сообщение Apr 2 2007, 18:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 26-06-04
Пользователь №: 192



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

Код
(*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)
при макс оптимизации дебагом проходился нормально.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Apr 3 2007, 00:54
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



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


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 3 2007, 09:10
Сообщение #3


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Dron_Gus @ Apr 3 2007, 01:54) *
вместо маски 0x0FFFFFFF сделал сдвиг на 4 бита, что вообщем-то тоже самое.

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


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Dainis
сообщение Apr 3 2007, 10:04
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 251
Регистрация: 23-06-04
Пользователь №: 154



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 архитектуры.
Go to the top of the page
 
+Quote Post
Romario
сообщение Apr 3 2007, 10:25
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 26-06-04
Пользователь №: 192



ну вобщем баг компилера очевиден, что довольно неприятно. не замечал у него багов ранее.
Go to the top of the page
 
+Quote Post
Dainis
сообщение Apr 3 2007, 11:58
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 251
Регистрация: 23-06-04
Пользователь №: 154



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


Я так и непоннал, где же баг ???
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Apr 3 2007, 12:23
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(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 не понял.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 3 2007, 13:26
Сообщение #8


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



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


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Romario
сообщение Apr 3 2007, 14:01
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 26-06-04
Пользователь №: 192



Цитата(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!

Сообщение отредактировал Romario - Apr 3 2007, 14:02
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 11:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01463 секунд с 7
ELECTRONIX ©2004-2016