Поддерживается ли MMX |
Previous Top Next |
Code: |
function SupportsMMX: Boolean; begin Result := False; try asm push eax push ebx push ecx push edx pushfd pop eax mov ebx,eax xor eax,$00200000 push eax popfd pushfd pop eax xor eax,ebx je @NoMMX mov eax,$01 test edx,$800000 jz @NoMMX mov byte ptr[Result],1
@NoMMX: pop edx pop ecx pop ebx pop eax end; except; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin if SupportsMMX then ShowMessage('Computer supports MMX'); end; |
©Drkb::01436
Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
Наша программа выполняет несложную операцию по определению наличия в процессоре технологии MMX, но при помощи этого кода можно узнать и много других характеристик процессора, путем посылки в регистр eax значений от 0 до 2 и при этом тестированием отдельных бит таких регистров как eax,ebx,ecx и edx командой bt (bit test), но наша задача заключается в том, чтоб показать различные способы подключения к delphi ассемблерного кода.
Для создания объектного модуля нужен файл TASM32.EXE, линковать объектный модуль файлом TLINK.EXE ненужно.
Например:
TASM32.EXE /ml CPU2.ASM
Полученный объектный модуль на ассемблере CPU2.OBJ
Code: |
.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} нужно чтоб все строки кода были или закомментированы или чтоб их еще не было вообще.
Code: |
unit Unit1;
interface
uses 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); begin if rez = 1 then edit1.Text:='MMX-технология есть' else edit1.Text:='MMX-технологии нет'; end;
end.
|
©Drkb::01437
DelphiWorld 6.0
Code: |
{ **** UBPFD *********** by delphibase.endimus.com **** >> Определение поддержки MMX
Зависимости: Types Автор: Gua, gua@ukr.net, ICQ:141585495, Simferopol Copyright: Unknown Дата: 17 июля 2002 г. ***************************************************** }
function CheckMMX: Boolean; var TempCheck: dword; begin TempCheck := 1; asm push ebx mov eax,1 db $0F,$A2 test edx,$800000 jz @NOMMX mov edx,0 mov TempCheck,edx @NOMMX: pop ebx end; CheckMMX := (TempCheck = 0); end; |
©Drkb::01438