[ Кодинг на C++ под Windows с использованием Assembler ]

Продолжая программировать на Borland C++ Builder 6, мы уже будет использовать
C++ вместе с ассемблером, так как я писал в ранее выпущенном номере про команды
ассемблера, я решил совместить два языка, что бы не писать две статьи, так
как это большой плюс сразу юзать C++ вместе с ассемблером, так мы ближе
познакомимся к командами ассемблера и сможем кое-где в своих программах снимать
нагрузку. Познавая все больше и больше команд ассемблера и функции C++ мы
сможем писать хорошие и самое главное, маловесящие программы. Всегда и как 
обычно я сразу приведу два примера кода программы и потом дам комментарии коду 
и после этого мы уже будем программировать какую-нибудь программу и познакомимся с 
некоторыми компонентами C++ Builder, вот два примера:


	>> Пример использует только C++

Откроем новый проект, добавим два компонента Label и Button, как показано на
рисунке "1.jpg", после этого нажмем два раза на Button и напишем такой код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int X = 1;             //Целой переменной присвоим значение 1
X = 1 + 1;             //Прибавим к переменной еще 1
Label1->Caption = X;   //Выводим результат
}

Как видите обычный пример - сначало мы объявили целую переменную X и присвоили
ей значение 1, потом прибавили еще один и вывели результат на форму в компонент
Label. Если нажать на кнопку то мы увидим "2", эх да что я говорю вы это и так
знаете, а теперь проведем такую же операцию, но с участием команд ассемблера.


	>> Пример использует C++ и Assembler

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int X;                 //Объявляем целую переменную
 __asm                 //Подключаем ассемблерную вставку
   {
     mov eax, 1;       //Вносим в регистр eax число 1
     add eax, 1;       //Добавляем еще 1 в регистр eax
     mov X, eax;       //Присвоим значения eax переменной X
   }
Label1->Caption = X;   //Выводим результат X
}

После выполнения результат будет таким же, как и в первом примере как показано
на рисунке "2.jpg", использование ассемблерных вставок в C++ называется
inline-ассемблером, его можно использовать свободно, как показано в примере,
переменные языка C++ тоже работают в ассемблере. Ассемблерную вставку можно
использовать и так:


	>> Пример еще одной ассемблерной вставки

__asm mov eax, 1;
__asm add eax, 1;
__asm mov X, eax;

Как говориться, на ваш вкус, а теперь пояснения к командам "MOV", "ADD" для чего
они в коде это всем понятно, я все же поясню:

MOV - Используется для пересылки данных, команда замещает первый операнд, к примеру
наша переменая "X" вторым источником "eax". Исходное значение первого операнда
"X" теряется, т.е., если мы присвоим перемнной X какое-либо значение сразу, то оно
будет утерено и будет замещена значением "eax". В качестве источника у нас в
коде это регистр "eax", могут использоваться число, операнд, регистр или операнд,
находящийся в памяти, т.е. переменная.

ADD - Используется для выполнения арифметических операций, первого и второго
операнда, т.е. это может быть переменные "add x, y", регистры "add eax, ecx",
но содержимое первого операнда заменяется суммой, т.е. в коде сначала мы записали
число "1" в регистр "eax", потом командой "add" выполнили "1 + 1" и в
регистр "eax" записался результат "2" и после мы его спокойно передали переменной 
"X", как показано в коде выше, так же можно использовать значения как у нас в коде 
это "1", но нельзя использовать сегментные регистры.

Опять вернемся к C++ и напишем такой код с использованием инкремента т.е увелечения
значения переменной на "1" бегать вокруг не будем, пример:


	>> Код на C++ с использованием инкремента "++"

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int X = 3;                //Объявили целую переменную и присвоили значение 3
X++;                      //Увеличиваем значения переменной на один инкрементом "++"
Label1->Caption = X;      //Выводим результат
}

Результат работы на рисунке "3.jpg", хотя и так все понятно. Теперь проведем
такую же операцию с участием ассемблера:


	>> Код на С++ и использования Ассемблера

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int X;                  //Объявили целую переменную
 __asm                  //Подключили ассемблерную вставку
  {
   mov eax, 3;          //Заносим в eax число 3
   inc eax;             //Увеличиваем значения "eax" на 1
   mov X, eax;          //Заносим значение "eax" в переменную X
  }
Label1->Caption = X;    //Выводим результат
}

Результат на рисунке "4.jpg", как видно в примере точно такую же операцию как
на C++ можно произвести и на ассемблере, тут нет ничего сложного, если знать, как
пользоваться данной командной, вы ее уже знаете и поэтому как обычно пояснения к новой
команде:

INC - Данная команда прибавляет 1 к операнду, в нашем случае это регистр "eax",
в качестве операнда можно использовать регистр и переменную. Нельзя использовать
сегментный регистр.

Теперь сделаем обратную операцию т.е. декремент уменьшения на 1 значения переменной
на языке C++, реализуица она так "--". Код операции декремента:


	>> Код на C++ с использованием декремента "--"

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int X = 4;             //Объявили целую переменную и присвоили значения 4
X--;                   //Отнимаем 1 от переменной X
Label1->Caption = X;   //Выводим результат
}

Любому кодеру понятно что когда выполнится код, результатом будем число 3,
для новичком объясню что операция декремент отнимает "1" от значения переменной:
было 4, стало 3. Теперь так же самая операция на ассемблере:


	>> Код на С++ с использованием Ассемблера

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int X ;                  //Объявили целую переменную X
  __asm                  //Подключаем ассемблерную вставку
    {
     mov eax, 4;         //Загоняем число 4 в регистр eax
     dec eax;            //Уменьшаем значения регистра eax на 1
     mov X, eax;         //Значения eax присваеваем переменной X
     }
Label1->Caption = X;     //Выводим результат
}

Все просто и понятно, такой же результат как и на С++, операция DEC работает точно
также как и INC только не прибавляет, а отнимает, в остальном, все точно также.

Думаю можно закончить с ассемблером и начать изучения компонентов С++ Builder, а
именно мы познакомимся поближе с "ProgressBar", "PageControl" и "CheckBox". И так,
давайте кинем на форму компонент "PageControl". Его можно взять с вкладки "Win32",
нажмем на него правой кнопкой и выбирем два раза "New Page", в окне "Object TreeView"
что слева от вас, выбирем по одному каждый новый "TabSheet" и в поле "Caption"
присвоим имена "Настройки", "Выполняем", на странице "Настройки" положим четыре
"CheckBox" взять их можно с вкладки "Standart" и присвоим полю "Caption"
значения которые показаны на рисунке "5.jpg", извините, но я человек с
юмором :), дальше на странице "Выполняем" положим компонент "ProgressBar" и
две кнопки "Button" и четыре компонента "Label", как показано на рисунке "6.jpg",
если скомпилировать приложения, то сможете переключаться между "Страницами"
отмечать "CheckBox", но давайте сделаем так чтобы программа реагировала на наши
действия, а именно, напишем код для кнопки "Выполнить" для "Выход" напишите уже
давно знакомый код "Close();" и так код для кнопки "Выполнить":

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;                                                           //Объявляем целую переменую
ProgressBar1->Enabled == TRUE;                                   //Активируем компонент ProgressBar
ProgressBar1->Min = 0;                                           //Устанавливаем Min на 0
ProgressBar1->Max = 3000;                                        //Устанавливаем Max на 3000
for (i = ProgressBar1->Min; i <= ProgressBar1->Max; i++ )        //Выполняем цикл до тех пор, пока Min не будет больше, либо равно Max
   {                                                             //Открываем цикл
    ProgressBar1->Position = i;                                  //Устанавливаем нашу переменную чтобы видели полоску ProgressBar
    if ( CheckBox1->Checked == TRUE )                            //Оператор if проверяет выбрано ли CheackBox если да, то
      {
       Label1->Caption = "Ты правильно делаешь";                 //Вывести это сообщение
      }else{                                                     //если нет
       Label1->Caption = "Уууу мужик ну ты даешь :(";            //то это сообщение, дальше точно так же.
      }
     if ( CheckBox2->Checked == TRUE )
      {
       Label2->Caption = "Малодца...:)";
      }else{
       Label2->Caption = "Ты нечего не подцепил? :)";
      }
     if ( CheckBox3->Checked == TRUE )
      {
       Label3->Caption = "Отлично :) научишь?";
      }else{
       Label3->Caption = "Ну тогда зачем написал меня?";
      }
     if ( CheckBox4->Checked == TRUE )
      {
       Label4->Caption = "Хакер это хорошо, мачи америку :)";
      }else{
       Label4->Caption = "Законопослушный?";
      }
   }                                                             //Закрываем цикл
}

Данный код понятен любому программисту, даже чайнику, суть в том что бы показать
как можно пользоваться компонентом "PageControl" для организации меню программы
или что бы не использовать огромное количество "ОКОН" а просто и легко в своей
программе задать любые параметры или сообщения на "PageControl". Если не хотите
что бы при выполнении "ProgressBar" были квадратики, то тогда в "Object Instector"
компонента ProgressBar переставьте значение "Orientation" на "pbVertical" как
показано на рисунке "7.jpg", так же мы рассмотрели компонент "CheckBox", как им
пользоваться вы поняли. В следующих статьях на данную тему, мы уже будет писать
программы, использовать и разбирать использованные компоненты, и, конечно же,
ассемблер, но уже в разных статьях, в этой я просто показал пару команд ассемблера
и как пользоваться им в C++, думаю понятно, да примеры маленькие, но как же еще
показать работу команд? Конечно же на маленьких примерах, все начинают с маленького,
а потом берут выше, до новых встреч!

P.S. Иллюстрации к статье лежат в /include/coding/*

(с) Outlaw