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

 
 
> 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
 
Start new topic
Ответов
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



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

 


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


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