Я критикую не Филипа - респект ему и уважуха, сам проект мне нравится. Иначе бы я просто не писал в эту ветку.
Я критикую реализацию простой в общемто вещи - генерации кода инициализации переменных типа static. А эмоции... Ну сам понимаешь. Когда что-то давно хочешь, а этого нет - они возникаютКакто раз я пытался разобраться с кодогенерацией SDCC, чтобы поправить эту фичу, но не разобрался.
Во всех известных мне компиляторах C - в секцию .data помещаются уже инициализированные данные. И нигде код не генерится. Исключение - микроконтроллеры - но там слепок секции .data хранится в ПЗУ и при инициализации полностью копируется на своё место в ОЗУ.
Так что если кого задела моя ругань - извиняюсь.
Но если кто подскажет - где и как в исходниках SDCC генерится инициализация переменных - то скажу спасибо.
с другой стороны, если я представляю себя на месте автора... мне бы не хотелось, чтобы спрашивали одно и то же куча людей. плюс, надо посмотреть всякие трекеры и прочие места, не сообщалось ли там уже такое. данная вещь (про инициализацию) - очевидна, я не поверю, что никто про это раньше не говорил и что автор не в курсе. я уверен, что это есть в планах давным давно. могу ошибаться, но скорее всего - нет.
и мотивацию тоже надо учитыватьее недостаточно для написания нормального репорта, а просто мнение выразить - пожалуйста.
Что-то вообще странное с инициализацией у нас
По идее, первые две строки абсолютно равнозначны. ОднакоКод:char* hello1 = "Hello"; char hello2[] = { 'H', 'e', 'l', 'l', 'o', 0 }; void main() { }
А ведь нет! Попробовал для ds390 (от балды), там все хорошо. Надо заводить тикет.Код:.area _DATA _hello1:: .ds 2 _hello2:: .ds 6 .area _GSINIT ;1.c:1: char* hello1 = "Hello"; ld hl,#__str_0 ld (_hello1),hl ;1.c:2: char hello2[] = { 'H', 'e', 'l', 'l', 'o', 0 }; ld hl,#_hello2 ld (hl),#0x48 inc hl ld (hl),#0x65 ld hl,#_hello2 + 2 ld (hl),#0x6C ld hl,#_hello2 + 3 ld (hl),#0x6C ld hl,#_hello2 + 4 ld (hl),#0x6F ld hl,#_hello2 + 5 ld (hl),#0x00 .area _CODE __str_0: .ascii "Hello"
---------- Post added at 00:24 ---------- Previous post was at 00:03 ----------
Завел
потому что "Hello" - в данном случае - константа. А char* hello1 - переменная-указатаель.
Если ты напишешь
char a[10]="hello", то сгенерится
Код:.area _DATA _a:: .ds 10 ;-------------------------------------------------------- ; overlayable items in ram ;-------------------------------------------------------- .area _OVERLAY ;-------------------------------------------------------- ; external initialized ram data ;-------------------------------------------------------- ;-------------------------------------------------------- ; global & static initialisations ;-------------------------------------------------------- .area _HOME .area _GSINIT .area _GSFINAL .area _GSINIT ;cls.c:4: char a[10]="hello"; ld hl,#_a ld (hl),#0x68 ld a,#0x65 ld (#_a + 1),a ld a,#0x6C ld (#_a + 2),a ld (#_a + 3),a ld a,#0x6F ld (#_a + 4),a ld bc,#_a + 5 ld a,#0x00 ld (bc),a
Я говорю - кодогенерация для инита переменных Z80 - очень сырая. Кто хорошо знает английский - напишите аффтору, еслти нет такой темы.
По-хорошему надо просто генерить
И никакого кодаКод:.area _DATA _a:: .ascii "hello",0,0,0,0,0
Если написать
const char a[10]="hello", то сгенерится всё верно, только в сегмент _CODE
Последний раз редактировалось SfS; 19.09.2012 в 05:03.
Я писал, закрыли, потому что дубликат древнего http://sourceforge.net/tracker/?func...99&atid=350599
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)