Логотип.
 Разделы сайта Cтатьи.
Сайт в разработке!

Статистика сайта.

Посещений за день: 93
Посещений за месяц: 463
Посещений за год: 14618


Баннеры.

DMconnect
Maksy's PWS


Статистика в картинках.

likes counter


  • Главная.
  • Новости.
  • Программы.
  • Файлы.
  • Контакты.
  • Чат "Пиво".
  • Статьи.
  • Ссылки.
  • Гостевая.
  • Основы языка программирования 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
    


     В С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 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 прерывает работу функции и возвращает значение в вызывающую функцию.

    >>

    BitByByte, 2000г. (2025).