|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Solid C - компилятор Си для Спринтера
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22600 Location: Silicon Valley
|
И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?
|
08 Oct 2004 16:53 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
Мне попадался Солид только для MSX-DOS. Автор Солида японская фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе. На платформе x86 у них есть си-компилятор LSI v3.30c.
_________________Vasil Ivanov vasil-i@yandex.ru
|
10 Oct 2004 13:21 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
Значит у япошек на то время был не тот стандарт Си
_________________Vasil Ivanov vasil-i@yandex.ru
|
10 Oct 2004 13:32 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
| | | | Shaos wrote: Кое что непонятно: | | | | Code: #include <stdio.h>
char buffer[4]="AAA"; //char buffer[4]={'A','A','A','A'};
void main() { printf("0x%02X\n", *buffer); // (1) не правильно! printf("0x%02X\n", (char *) *buffer); // (2) правильно }
Если массив buffer представляет собой char-элементы, то при обращении к нему, как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно. При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери- ровал правильный код, к отдельному элементу char-массива нужно обращаться так, как это сделано в строке (2), принудительно указав компилятору через cast- операцию то, что нам нужно. При обращении к массиву, состоящему из int-элементов, вышеописанных проблем не возникает, компилятор генерирует правильный код. Для более наглядного представления, о чем идет речь, можно просмотреть asm- листинг, генерируемый компилятором для приведенного выше примера. Для строки (1) компилятор не сгенерирует код "ld b,0".
| | | | |
Как я понимаю вместо printf("0x%02X\n", (char *) *buffer); надо писать printf("0x%02X\n", (char) *buffer); иначе ерунда какая-то получается | | | | |
Нет. При обращении к char-массиву для printf надо писать не как *buffer а как (char *) *buffer Можешь сравнить два варианта записи, по асм-листингам после 2-го прохода си-компилятора.
_________________Vasil Ivanov vasil-i@yandex.ru
|
10 Oct 2004 13:39 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
IRL формат отличается от REL формата только тем, что имеет в начале файла индексированный заголовок. Далее идет rel-имидж, его начало выровнено на границу 128 байт. Чтобы из irl-формата сделать rel-формат, надо просто убрать индексированный заголовок и все. IRL-формат делает только библиотекарь ol.exe. Асм генерит обычные rel-файлики. Ну линкер ессно понимает оба формата. У меня где-то был IRL на англицком, если найду, то брошу тебе. На счет отличных функций,.... надо время. Буду иметь это ввиду.
_________________Vasil Ivanov vasil-i@yandex.ru
|
10 Oct 2004 13:49 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22600 Location: Silicon Valley
|
| | | | Vasil Ivanov wrote: | | | | Shaos wrote: Кое что непонятно: | | | | Code: #include <stdio.h>
char buffer[4]="AAA"; //char buffer[4]={'A','A','A','A'};
void main() { printf("0x%02X\n", *buffer); // (1) не правильно! printf("0x%02X\n", (char *) *buffer); // (2) правильно }
Если массив buffer представляет собой char-элементы, то при обращении к нему, как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно. При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери- ровал правильный код, к отдельному элементу char-массива нужно обращаться так, как это сделано в строке (2), принудительно указав компилятору через cast- операцию то, что нам нужно. При обращении к массиву, состоящему из int-элементов, вышеописанных проблем не возникает, компилятор генерирует правильный код. Для более наглядного представления, о чем идет речь, можно просмотреть asm- листинг, генерируемый компилятором для приведенного выше примера. Для строки (1) компилятор не сгенерирует код "ld b,0".
| | | | |
Как я понимаю вместо printf("0x%02X\n", (char *) *buffer); надо писать printf("0x%02X\n", (char) *buffer); иначе ерунда какая-то получается | | | | |
Нет. При обращении к char-массиву для printf надо писать не как *buffer а как (char *) *buffer Можешь сравнить два варианта записи, по асм-листингам после 2-го прохода си-компилятора. | | | | |
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...
|
10 Oct 2004 15:46 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22600 Location: Silicon Valley
|
Может имеет смысл указать на авторство в readme? И присовокупить доки от оригинального компиля?
|
10 Oct 2004 15:55 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
На авторство - нет проблем, засуну строчки. Кроме того, оно везде упоминается в титлах программ пакета. На счет оригинальных док - у меня их нет. Есть только доки к MSC-C и они на русском (пробегали как-то по эхе ZX.SPECTRUM). Он отличается от Солида опциями компилятора, именами файликов и юзает мелкософтские асм m80.com и линкер L80.com.
_________________Vasil Ivanov vasil-i@yandex.ru
|
13 Oct 2004 13:31 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
| | | | Shaos wrote: | | | | Vasil Ivanov wrote: | | | | Shaos wrote: Кое что непонятно: | | | | Code: #include <stdio.h>
char buffer[4]="AAA"; //char buffer[4]={'A','A','A','A'};
void main() { printf("0x%02X\n", *buffer); // (1) не правильно! printf("0x%02X\n", (char *) *buffer); // (2) правильно }
Если массив buffer представляет собой char-элементы, то при обращении к нему, как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно. При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери- ровал правильный код, к отдельному элементу char-массива нужно обращаться так, как это сделано в строке (2), принудительно указав компилятору через cast- операцию то, что нам нужно. При обращении к массиву, состоящему из int-элементов, вышеописанных проблем не возникает, компилятор генерирует правильный код. Для более наглядного представления, о чем идет речь, можно просмотреть asm- листинг, генерируемый компилятором для приведенного выше примера. Для строки (1) компилятор не сгенерирует код "ld b,0".
| | | | |
Как я понимаю вместо printf("0x%02X\n", (char *) *buffer); надо писать printf("0x%02X\n", (char) *buffer); иначе ерунда какая-то получается | | | | |
Нет. При обращении к char-массиву для printf надо писать не как *buffer а как (char *) *buffer Можешь сравнить два варианта записи, по асм-листингам после 2-го прохода си-компилятора. | | | | |
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю... | | | | |
В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет именно как к чар-массиву. Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил: Для текста Солид компилит следующий асм-листинг: Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-". Для текста же Солид компилит правильный асм-листинг:
_________________Vasil Ivanov vasil-i@yandex.ru
|
13 Oct 2004 14:03 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22600 Location: Silicon Valley
|
| | | | Vasil Ivanov wrote: В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет именно как к чар-массиву. Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил: Для текста Солид компилит следующий асм-листинг: Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-". Для текста же Солид компилит правильный асм-листинг: | | | | |
Да - это глюк. А если попробовать вот так: printf("0x%02X\n", *(char*)buffer); кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си
|
13 Oct 2004 16:31 |
|
|
dhau
Maniac
Joined: 12 Oct 2004 13:49 Posts: 233
|
Лучшая прошивка для Xbox - Xecuter 2 - написана на 100% C Конкуренты-ассемблерщики просто неспособны обеспечить тот-же уровень надежности и функциональности. Но для маленьких 8-бит устройств C - не вариант
|
14 Oct 2004 09:12 |
|
|
dhau
Maniac
Joined: 12 Oct 2004 13:49 Posts: 233
|
|
15 Oct 2004 08:28 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22600 Location: Silicon Valley
|
Только что проверил сам - похоже, что %X вообще неработает с типами char - ни с *buffer, ни с buffer[0], ни просто с переменной типа char - прибавляется еще старший байт, НО если предварительно сделать присвоение int i = *buffer и именно этот int скормить принтфу - то все будет ок.
|
15 Oct 2004 17:48 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
| | | | Shaos wrote: | | | | Vasil Ivanov wrote: В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет именно как к чар-массиву. Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил: Для текста Солид компилит следующий асм-листинг: Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-". Для текста же Солид компилит правильный асм-листинг: | | | | |
Да - это глюк. А если попробовать вот так: printf("0x%02X\n", *(char*)buffer); кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си | | | | |
И эту запись так же компилит с ошибкой. Поэтому я и говорю, что имеем глюк компилятора.
_________________Vasil Ivanov vasil-i@yandex.ru
|
16 Oct 2004 11:05 |
|
|
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
У него можно получить сорцы SOLID C или это глухое дело ?.
_________________Vasil Ivanov vasil-i@yandex.ru
|
16 Oct 2004 11:24 |
|
|
Who is online |
Users browsing this forum: No registered users and 21 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|