тел: (0412) 22-74-83 Основы языка программирования C86. ==================================== В основе языка C86 лежит подмножество стандарного C. Далее кратко изложены основные возможности языка, основные принципы его при- менения. Общие положения. ---------------- Идентификаторы (имена переменных и функций) ограничены 6 символами. Запуск компилятора осуществляется двояко: 1) C86 <ВК> - далее программа будет запущена, отвечайте на вопросы. с параметрами: 2) С86 вх.файл вых.файл нач.метка Например: C86 /? C86 mus.c mus.asm 1 Последний параметр показывает, с какого номера будут начинаться метки. Если же он не указан, по умолчанию берется метка с номером 1, кроме того, в виде комментариев выводится компилируемый текст ( если третий параметр указывается - исходный текст не выводится !) Полученный ассемблерный файл необходимо оттранслировать при помощи макроассемблера или турбоассемблера: MASM mus.asm ; или TASM mus.asm ; LINK mus.obj ; TLINK mus.obj ; EXE2BIN mus.exe mus.com EXE2BIN mus.exe mus.com Естественно, все эти действия можно объединить в .BAT файл: файл m86.bat: файл t86.bat : ================ ================ MASM %1 ; TASM %1 ; LINK %1 ; TLINK %1 ; EXE2BIN %1.EXE %1.COM EXE2BIN %1.EXE %1.COM DEL %1.OBJ DEL %1.EXE DEL %1.EXE DEL %1.OBJ DEL %1.MAP ...... При успешной компиляции (ошибок 0) C86 возвращает ERRORLEVEL 0. В случае ошибок компиляции возвращаетя ERRORLEVEL 1. Возможный вариант объединенного пакетного файла: для компиляции PROG.C: 86 prog файл 86.bat: ==================== c86 %1.c %1.asm if ERRORLEVEL 1 goto err_find echo ОШИБОК НЕТ !!! m86 %1 goto exit :err_find echo !!! Обнаружены ОШИБКИ !!! :exit Данные C86. ----------- В С86 предусмотрены два типа данных : тип char и тип int (а также ука- затели на эти типы). Например: int ivar; /* целая переменная */ int iarr[12]; /* целочисл. массив */ int *iptr; /* указатель на int */ char cvar; /* символьная перем.*/ char carr[12]; /* массив символов */ char *cptr; /* указатель на char*/ При этом на переменную типа int выделяется 2 байта, на переменную типа char 1 байт. В C86 не предусмотрена возможность определения новых ти- пов. Директивы препроцессора. ------------------------ В C86 включены следующие директивы препроцессора: #define; #include; #asm; #endasm Первая директива применяется для замены констант на мнемоническое имя для облегчения разработки текста программы.Например: #define TWO 2 /* в дальнейшем в теле программы можно пользоваться */ /* именем TWO вместо константы 2 */ #define MAXCOL 79 .... Вторая директива служит для подключения в процессе компиляции внешнего файла, имя которого указывается после: #include extend.c /* прочитать и оекомпилировать текст,хранящийся в */ /* файле extend.c */ #include outdec.c .... Новыми и оригинальными являются директивы #asm, #endasm. Они указывают компилятору на то, что между ними находится ассеблерный текст и он должен быть просто перенесен в выходной файл без модификации: #asm xor ax,ax mov al,mode1 int 10h ;установить режим экрана ....... #endasm Математические действия. ------------------------- + сложение a1=a2 + a3; - вычитание a1=a2 - a3; * умножение a1=a2 * a3; / деление a1=a2 / a3; % вычисление остатка при делении a1=a2 % a3; << побитовый сдвиг влево a1=a2 << a3; >> побитовый сдвиг вправо a1=a2 >> a3; ++ увеличение операнда на 1 a1++; ++a1; -- уменьшение операнда на 1 a1--; --a1; | побитовое "или" a1=a2 | a3; & побитовое "и" a1=a2 & a3; () группирующие скобки a1=(a2*(a3+a4)+a5)/a6; Возможности структурирования. ----------------------------- {} операторные скобки, объединяют несколько операторов: { a1=a2+1; a3++; write(d2); } if(условие) условный оператор, условия: == равенство != неравенство > больше < меньше >= больше-равно <= меньше-равно else - иначе например: if(xx==22) write(dd1) else write(dd2); if((yy>2)&(xx<=33) { read(ff); a1=a1+ff; write(a1); } else { ch1=getchar(); if(ch1=0) a1=a1+1; } .......... Оператор цикла. while(условие) для прерывания тела цикла служит опера- тор break . Для ускоренного перехода в цикле к заголовку служит опера- тор continue . Например: ii=1; while (ii++<22) { if(getchar()==32)continue; /* следующие операторы в случае */ /* выполнения continue не выполняются */ gotoxy(10,22); /* какие-то действия */ write(ii); if(getchar()==27)break; /* если сработает break - окажемся за */ /* пределами цикла */ } ....... Подпрограммы. -------------- Как и в обычном Си возможно объявление функций. Если из функции необ- ходимо вернуть какое-либо значение необходим оператор return. Напри- мер: addfunc(a1,a2) /* имя функции */ int a1,a2; /* принимаемые переменные */ { /* тело функции */ char mm; /* локальные переменные */ int ff; mm=0; mm=mm+a1; ff=a2 << 1; ff=a1 / mm; return(ff); /* возвратить в вызывающую функцию значение ff */ } Примечание: Передача значений в функцию осуществляется через стек, ========== возврат значения осуществляется через регистр Ax. Оператор return прерывает работу функции и возвращает значение в вызывающую функцию. ===================================================================== ##################################################################### Несомненно, общаясь с программой Вы многому научитесть, поймете осо- бенности многих функций и поднатореете как в Си, так и в Ассемблере. Желаю Вам успехов в Вашем нелегком пути ! 04.02.93 Сергей Викторович Москаленко ====================================================================== Украина,262000,г.Житомир, Главпочтамт, а/я 2 тел: (0412) 22-74-83 ====================================================================== ВНИМАНИЕ !!! С.В.Москаленко готов сотрудничать с организациями и частными лицами в разработке и адаптации программ для ПЭВМ. Все на что способны C, PASCAL, ASSEMBLER, CLIPPER - для ВАС !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ----------------------------------------------------------------------- АВТОР продает авторские права на свои оригинальные разработки/заключает договоры на распространение своих оригинальных разработок !!!!!!!!!!!!! - end - ------------------------------- (c) Sergey Moskalenko E-mail: sergey_msv@mail.ru http://chat.ru/~msv_serg http://chat.ru/~msv_engl http://chat.ru/~poisk1 :) .