Обрадовалася душа, что такой весь сабж хороший, давай думаю его наконец заюзаю. Не прошло и полчаса, как наступил на багу.
Свежайшая версия 3.3.0 компилирует вот в это:Код:char i; void main(void) { i = 0; while (1) i = (i == 3) ? 0 : (i + 1); }
Я думаю, комментировать не надо.Код:_main: ;1.c:9: i = 0; ld hl,#_i + 0 ld (hl), #0x00 ;1.c:11: while (1) 00102$: ;1.c:13: i = (i == 3) ? 0 : (i + 1); ld a,(#_i + 0) cp a,#0x03 jr Z,00107$ inc a 00107$: ld (#_i + 0),a jr 00102$
ИЧСХ, проверил на версии 2.9.0 (та, которая в шыру-СДК):
Предлагается найти 100500 отличий.Код:_main: ;1.c:9: i = 0; ld hl,#_i + 0 ld (hl), #0x00 ;1.c:11: while (1) 00102$: ;1.c:13: i = (i == 3) ? 0 : (i + 1); ld a,(#_i+0) sub a,#0x03 jr NZ,00106$ ld c,#0x00 jr 00107$ 00106$: ld hl,#_i + 0 ld c,(hl) inc c 00107$: ld hl,#_i + 0 ld (hl), c jr 00102$
Cвежая версия делает намного более вменяемый код. Но пропустить ТАКУЮ багу...
Ладно бы код был какой экзотичный. И что интересно: если написать например:
то получится уже вот так:Код:i = (i == 3) ? 1 : (i + 1);
Перепутали CP и SUB, бида бида...Код:ld a,(#_i + 0) sub a, #0x03 ; <-- !!!!!!!!!!!!!!!!! jr NZ,00106$ ld a,#0x01 jr 00107$ 00106$: ld a,(#_i + 0) inc a 00107$: ld (#_i + 0),a
---------- Post added at 03:57 ---------- Previous post was at 03:51 ----------
Проверил: присутствует в версиях 3.2.0 и 3.1.0 Нету в версии 3.0.0, но она генерит такую же капусту, как и 2.9.0.


 
 
					
					
					
						
  Ответить с цитированием
 Размещение рекламы на форуме способствует его дальнейшему развитию 


 