- Code: Select all
char i;
void main(void)
{
i = 0;
while (1)
i = (i == 3) ? 0 : (i + 1);
}
Свежайшая версия 3.3.0 компилирует вот в это:
- Code: Select all
_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 (та, которая в шыру-СДК):
- Code: Select all
_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$
Предлагается найти 100500 отличий.
Cвежая версия делает намного более вменяемый код. Но пропустить ТАКУЮ багу...
Ладно бы код был какой экзотичный. И что интересно: если написать например:
- Code: Select all
i = (i == 3) ? 1 : (i + 1);
то получится уже вот так:
- Code: Select all
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
Перепутали CP и SUB, бида бида...