Romario 0 2 апреля, 2007 Опубликовано 2 апреля, 2007 · Жалоба соответсвует ли дизасм С строчки? (*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 2 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Точно утверждать не буду, но, по-моему, компилятор вместо маски 0x0FFFFFFF сделал сдвиг на 4 бита, что вообщем-то тоже самое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SpiritDance 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба вместо маски 0x0FFFFFFF сделал сдвиг на 4 бита, что вообщем-то тоже самое. Да ну нафиг. По вашему получить от числа 0x1234 после такого "маскирования" число 0x0123 это тоже самое что получить 0x0234? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dainis 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба 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 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба ну вобщем баг компилера очевиден, что довольно неприятно. не замечал у него багов ранее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dainis 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба ну вобщем баг компилера очевиден, что довольно неприятно. не замечал у него багов ранее. Я так и непоннал, где же баг ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Да ну нафиг. По вашему получить от числа 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 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Извиняюсь, сморозил фигню - на код асма недосмотрел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Romario 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 (изменено) · Жалоба Я так и непоннал, где же баг ??? я уже запутался с дизасмом и проверками но смысл такой: вчера целый день убил. Вот такой код выводил следущее: 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! Изменено 3 апреля, 2007 пользователем Romario Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться