- •1) Напишите и отладьте программу, которая выводит на экран 64 ascii символа, начиная с символа пробела. Исходный текст программы имеет следующий вид:
- •Int 21h ; прерывание, функция
- •2) Напишите программу, которая выводит на экран строку сообщения, например, сообщение «Hello, World!». Самостоятельно разберите назначение каждой команды.
- •Создание приложения для получения характеристик компьютера и операционной системы.
- •Контрольные вопросы
Создание приложения для получения характеристик компьютера и операционной системы.
Создали форму с перечисленными компонентами.
Для события формы OnCreate записали следующий программный код:
procedure TForm1.FormCreate(Sender: TObject);
VAR
v:TOSVERSIONINFO;
reg:TRegistry;
a:Array[0..255] of Char;
begin
Edit1.Text:='C:\';
// Информация об операционной системе
v.dwOSVersionInfoSize:=Sizeof(OSVERSIONINFO);
GetVersionEx(v);
Edit6.Text:=IntToStr(v.dwMajorVersion)+'.'+IntToStr(v.dwMinorVersion);
Edit7.Text:=IntToStr(v.dwBuildNumber);
Edit8.Text:=v.szCSDVersion;
case v.dwPlatformId of
VER_PLATFORM_WIN32s: Edit9.Text:='Win32s on Windows 3.1.';
VER_PLATFORM_WIN32_WINDOWS: Edit9.Text:='Win32 on Windows 95.';
VER_PLATFORM_WIN32_NT: Edit9.Text:='Win32 on Windows NT.';
end;
// Определение, из какого каталога инсталлировалась Windows
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Setup',false);
Edit10.Text:=reg.ReadString('SourcePath');
reg.CloseKey;
reg.Free;
// Системные каталоги
GetSystemDirectory(@a,Sizeof(a));
Edit11.Text:=a;
GetWindowsDirectory(@a,Sizeof(a));
Edit12.Text:=a;
end;
Для события формы OnClick кнопки «Получить» записали следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
VAR
SerialNum:DWORD;
a,b:DWORD;
Buffer,disk :Array[0..255]of char;
begin
StrPCopy(@disk,Edit1.text);
if GetVolumeInformation(@disk,Buffer,sizeof(Buffer),@SerialNum,a,b,nil,0) then
begin
Edit2.Text:=IntToStr(SerialNum);
Edit3.Text:=Buffer;
Edit4.Text:=IntToStr(a);
end;
end;
Для получения тактовой частоты процессора включили в проект следующую функцию:
function GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi: DWORD;
TimerLo: DWORD;
PriorityClass: Integer;
Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
DW 310Fh // rdtsc
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
Sleep(DelayTime);
asm
DW 310Fh // rdtsc
SUB EAX, TimerLo
SBB EDX, TimerHi
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result:=TimerLo/(1000.0 * DelayTime);
end;
Для события формы OnClick кнопки «Определить» записали следующий программный код:
procedure TForm1.Button2Click(Sender: TObject);
begin
// Получение тактовой частоты процессора
Edit5.Text:=Format('CPU Speed: %f MHz',[GetCpuSpeed]);
end;
Работа проекта представлена на рисунке 2.
Рисунок 2
Текст программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Registry;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Edit1: TEdit; Edit2: TEdit;
Edit3: TEdit; Edit4: TEdit; Button1: TButton; Edit5: TEdit; Button2: TButton; Label5: TLabel;
Label6: TLabel; Edit6: TEdit; Edit7: TEdit; Label7: TLabel; Label8: TLabel; Edit8: TEdit;
Edit9: TEdit; Label9: TLabel; Edit10: TEdit; Label10: TLabel; Edit11: TEdit; Label11: TLabel;
Edit12: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
function GetCPUSpeed: Double;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
VAR
v:TOSVERSIONINFO;
reg:TRegistry;
a:Array[0..255] of Char;
begin
Edit1.Text:='C:\';
v.dwOSVersionInfoSize:=Sizeof(OSVERSIONINFO);
GetVersionEx(v);
Edit6.Text:=IntToStr(v.dwMajorVersion)+'.'+IntToStr(v.dwMinorVersion);
Edit7.Text:=IntToStr(v.dwBuildNumber);
Edit8.Text:=v.szCSDVersion;
case v.dwPlatformId of
VER_PLATFORM_WIN32s: Edit9.Text:='Win32s on Windows 3.1.';
VER_PLATFORM_WIN32_WINDOWS: Edit9.Text:='Win32 on Windows 95.';
VER_PLATFORM_WIN32_NT: Edit9.Text:='Win32 on Windows NT.';
end;
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Setup',false);
Edit10.Text:=reg.ReadString('SourcePath');
reg.CloseKey;
reg.Free;
GetSystemDirectory(@a,Sizeof(a));
Edit11.Text:=a;
GetWindowsDirectory(@a,Sizeof(a));
Edit12.Text:=a;
end;
procedure TForm1.Button1Click(Sender: TObject);
VAR
SerialNum:DWORD;
a,b:DWORD;
Buffer,disk :Array[0..255]of char;
begin
StrPCopy(@disk,Edit1.text);
if GetVolumeInformation(@disk,Buffer,sizeof(Buffer),@SerialNum,a,b,nil,0) then
begin
Edit2.Text:=IntToStr(SerialNum);
Edit3.Text:=Buffer;
Edit4.Text:=IntToStr(a);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit5.Text:=Format('CPU Speed: %f MHz',[GetCpuSpeed]);
end;
function Tform1.GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi: DWORD;
TimerLo: DWORD;
PriorityClass: Integer;
Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
DW 310Fh
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
Sleep(DelayTime);
asm
DW 310Fh
SUB EAX, TimerLo
SBB EDX, TimerHi
MOV TimerLo, EAX
MOV TimerHi, EDX
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result:=TimerLo/(1000.0 * DelayTime);
end;
end.
Вывод по работе: изучили процедуры и функции Win32, позволяющие получить общую информации о характеристиках компьютера и операционной системы, создали приложение для их получения. Ознакомились с процессом разработки программы и трансляции ее с помощью ассемблера. Написали программу , которая выводит на экран 64 ASCII символа, начиная с символа пробела. Написали программу, которая выводит на экран строку сообщения «Hello, World!». Ознакомились с назначениями команд ассемблера, с работой командной строки ОС.