05.03.2000 Язык C-- [Deviator]

 Привет.
 Вот и наступила пора 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.