Завдання №10
Тема: Опрацювання числових масивів засобами вбудованого в С++ Builder Асемблері.
Мета роботи: Вивчення асемблерних умовних і циклічних команд та набуття навичок опрацювання масивів цілих чисел засобами вбудованого в C++ Buіlder асемблера.
Обладнання: ПЕОМ, OC Windows,C++ Builder
Хід виконання роботи:
Завдання: Обчислити кількість елементів, значення яких більше за значення першого елементу, ромір масиву 14.
Тест програми:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
Form1->Close();
}
//-------------------------------------------------------------------
void __fastcall TForm1::StartClick(TObject *Sender)
{ int j=0;
int i, a[10];
for(i=0; i<10; i++) a[i] = StrToInt(Memo1->Lines->Strings[i]);
asm
{ mov edx, 0 // Початковий зсув
mov ecx, 10 //Кількість повторень циклу
@next:
mov esi, dword ptr a+edx //Завантажити черговий елемент в esi
cmp esi,0 // Порівняти елемент з 0
jl @net //Якщо елемент < 0, перейти на мітку
add j,1 //додати 1
@net: add edx, 4 //Підготувати зсув для наступного елемента
loop
@next // Цикл: якщо есх>0, перейти на мітку
}
Edit1->Text=IntToStr(j);
}
Результат на Рис. 10.1.
Висновок: У цьому завданні ми навчилися працювати з масивами у С++ Builder Асемблері.
Рис. 10.1
Завдання №11
Тема: Опрацювання рядків та символьних масивів засобами вбудованого С++ Builder Асемблера.
Мета роботи: Вивчення асемблерних команд опрацювання рядків та набуття навичок застосовування їх при створенні проектів в С++ Buіlder із вбудованим асемблером.
Обладнання: ПЕОМ, OC Windows,C++ Builder
Хід виконання роботи
Завдання: Написати програму, котра вводить рядок символів і змінює місцями
третій та останній введені символи.
Текст програми:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
#pragma argsused
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int kol_pr(AnsiString , int );
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString S = Edit1->Text;
int k = S.Length(); //находим длинну строки
kol_pr(S, k); //вызов функции
Edit2->Text = S;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
int kol_pr(AnsiString s, int k)
{ int p;
asm
{ pusha // Запоминание значений регистров
mov edi, dword ptr [s] //заносим строку в регистр
mov ecx, dword ptr k //заносим число повторов в цикл
mov edx, 0 // Начальный сдвиг
cmp ecx, 0 //проверка на отсутсвие строки
je @exit //если нет строки->выход
cld
mov al, ',' //проверить знак на запятую
@next:
scasb
jne @skip //если он не “,” переходим по метке
inc edx // Увеличить количество на 1
mov byte ptr[edi-1],' ' //заменяем запятую пробелом
@skip:
loop @next //повтор
@exit:
mov dword ptr p, edx //переписываем строку
popa
//
Восстановление заначений регистров
}
return p;
}
Результат на Рис. 11.1.
Рис. 11.1
Висновок: У цьому завданні ми навчилися працювати з рядками та символьними масивами у С++ Builder Асемблері.
