Привет.
Вот и наступила пора C--...
Вступление.
Сидел я как-то в iRC и болтал с Мез'ой. Он утверждал (и утверждает) ,
что ЯВУ имеет будущее, а АСМ, увы, оного не имеет. В принципе так то и
оно,но скорее появится симбиоз АСМ'а и ЯВУ ,чем исчезнет что-то. Первым
(а может и нет) шагом в данном направлении является C--. Он был придуман
одним человеком, и этот один человек его собственно и развивал. У языка
появляются свои последователи. Но вот автор оставляет язык на произвол
судьбы,и его продолжает разрабатывать российский программист Михаил Шекер.
Кстати он добавил поддержку компиляцию в PE-EXE файлы,тип float и прочее.
Сам язык (компилятор в том числе) свободно распространяемый с исходниками.
В общем компилятор сделан довольно качественно.
Скачать компилятор ,его исходники (!) , доки и примеры можно на сайте
http://www.chat.ru/sheker/
Итак. Преимущества языка над всеми остальными:
- Сильная интеграция с ассемблером
- Размер и быстродействие не сопоставимы с любым другим ЯВУ
- Есть такие комманды,которые нигде не встретишь,но тем не менее
при написании чего-то экономится масса времени
Недостатки: (Ухх...Начнем.. :)
- Только недавно добавили тип float,в следствии чего есть глюки
при работе с оным
- Обьектов нет (размечтались!)
- Массивы только одномерные (настоящие программеры смогут обойти
данное ограничение)
- Совсем убитая арифметика
- и тд, и тд,и тд...
И так подробнее.
Синтаксис C-- в принципе одинаков с Си,но процедуры делятся
на 4 вида:
1. PASCAL - с паскалевской конвенцией вызова
2. CDECL - с Си'шной конвенцией
3. STDCALL - Виндовой
4. FASTCALL - Регистровой (параметры передаются через
регистры)
Асмовые вставки делаются так:
asm { ... }
или
$ASMCODE (пример: $mov AX,0x1234)
К регистрам можно обращатся как к простым переменным:
(внимание - все регистры должны быть напечатаны
заглавными буквами !)
SI = AX;
SI -= 2;
Для обращения к памяти используется следующая конструкция:
?SBYTE[MEM]
?SWORD[MEM]
?SDWORD[MEM]
и так далее...Пример:
AX = DSWORD[0x2C];
ES = ES + DSWORD[3] + 1; // :)
BX = DSWORD[SI];
В блоке asm {..} обращения к памяти делаются так:
mov AX,DSWORD[0x1234]
Если процедура опеределена как fastcall и перед ее именем
поставить ':', то ее можно использовать как макро-комманду.
Если fastcall явно не указан,то все-равно процедура является
регистровой.
:void test()
{
AX = 5;
}
test(); // Это скомпилируется в Call Test
@test(); // А вместо этого просто вставится код
// процедуры
Структуры.
struct suxx
{
byte suxx1;
byte suxx2;
} somevar; // Опеределит переменную somevar как
// структуру suxx
Преобразовании типа при присваивании:
byte c;
char b;
b = char c; // Простое преобразование
Циклы:
do {...} while (??);
loop (??) {...} // Аналогично Асму,но можно
// использовать не только CX
while (???) { }
for (??;??;??) { } // Си'шный for
Импорт бинарных данных:
FROM - при компиляции компилятор загрузит файл
указанный как параметр в указанный массив/переменную
Пример:
byte pic[128] = FROM "icon.pic";
EXTRACT - аналогично FROM,но еще и указывается начальное
смещение от начала файла,а также размер считываемых данных.
byte picpart[16*16] = FROM "some.pic",256,16*16
Индексация
Если надо конкретно указать компилятору,что нужно в переменную
положить не содержание переменной,а ее смещение,то используется
префикс '#'
Пример:
AX = #dta; // mov ax,offset dta
DX = #dta+0x1E; // lea dx,[Di][0x1E]
Если все еще интерестно - читайте документацию к компилятору.
Что я обнаружил после некоторого "общения" с компилятором...
Первое - код можно компилировать по разным смещениям (аналог org
для АСМ'a)
Второе - Из компилируемых файлов можно (и нужно :) убрать
(c) компилятора
Вот и все...А вирусы писать на Си-- проще простого. Если понимать ,
как работает компилятор и знать немного АСМ - то и проблем не будет.
P.S. Смотрите исходники C-- тривиалов
Deviator/HAZARD.
|