Лежит симпатичная девушка на пляже. К ней мужик начинает клеиться. Она его спрашивает:
- Вы кем работаете?
- Программистом.
- Вот представьте: приезжаете вы в отпуск на юг отдохнуть. А тут - компьютеры, компьютеры...
Наша программа выполняет несложную операцию по определению наличия в процессоре технологии MMX, но при помощи этого кода можно узнать и много других характеристик процессора, путем посылки в регистр eax значений от 0 до 2 и при этом тестированием отдельных бит таких регистров как eax,ebx,ecx и edx командой bt (bit test), но наша задача заключается в том, чтоб показать различные способы подключения к delphi ассемблерного кода.
Для создания объектного модуля нужен файл TASM32.EXE, линковать объектный модуль файлом TLINK.EXE ненужно.
Например:
TASM32.EXE /ml CPU2.ASM
Полученный объектный модуль на ассемблере CPU2.OBJ
.586 ; Будут использоваться дополнительные команды 586
.MODEL use32 small ; Модель памяти small используется для ; большинства программ на ассемблере
stack 100h ; Выделяем область памяти под стек 256 байт
.data
.code
start:
DelCpu proc
PUBLIC DelCpu ; объявляем процедуру видимую за пределами ; данного модуля
xor edx,edx ; обнуляем регистр edx для помещения в него ; результатов команды cpuid
mov eax,1 ; засылаем в eax 1 для заполнения регистра edx ; соответствующими полями после выполнения ; cpuid команды
cpuid ; команда идентификация процессора
bt edx,23 ; команда для тестирования отдельных бит в ; операнде, в нашем случае проверяем в edx 23 бит ; и если он устанавнен в 1 значит технология MMX ; в процессоре есть, а если 0 то нет. Эта команда ; также присваивает флагу переноса cf значение ; проверяемого бита
jnc no ; проверяем значение флага cf если оно равно 0 то ; на перейти на метку (no), если 1 то продолжаем
mov eax,1 ; в ассемблере для возврата результата в функцию ; нужно результат поместить в регистр eax, что мы ; и делаем
jmp exit ; безусловный переход на выход
no:
mov eax,0
exit:
ret ; выход из процедуры
DelCpu endp
end start
Модуль на Delphi
Очень важный момент, когда будете подключать модуль директивой {$L cpu2.obj} нужно чтоб все строки кода были или закомментированы или чтоб их еще не было вообще.
unit Unit1;
interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private{ Private declarations }public{ Public declarations }end;
var
Form1: TForm1;
rez: DWORD;
implementation{$L cpu2.obj} //подключение нашего asm модуля к delphi{$R *.dfm}function DelCpu: DWORD; external; // объявляем функцию DelCpu// внешней// ну дальше все понятноprocedure TForm1.FormCreate(Sender: TObject);
begin
rez:=DelCpu;
end;
procedure TForm1.Button1Click(Sender: TObject);
beginif rez = 1 then
edit1.Text:='MMX-технология есть'
else
edit1.Text:='MMX-технологии нет';
end;
end.
Определение наличия в процессоре технологии MMX описано в статье как выполнение операции с помощью ассемблерного кода, который проверяет бит 23 регистра edx для определения наличия MMX-технологии в процессоре.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.