[ Кодинг на 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