Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Inline assembler code   Найти похожие ветки 

 
DAT   (2005-02-24 14:03) [0]

Приветствую Всех!
В своей программе мне необходимо использовать инструкцию процессора CPUID, однако компиллятор Дельфи 5 ее не поддерживает. Обхожусь тем, что помещаю байты опкода этой инструкции (0f, a2) напрямую в поток команд. Далее код:

var Signature:integer;
begin
asm
  mov eax, 1
  db 0fh
  db 0a2h
  mov Signature, eax
end;

StaticText1.Caption:=IntToHex(Signature,4);


присваивание StaticText1.Caption:=IntToHex(Signature,4) не происходит. Т.е. значение StaticText1.Caption остается прежним, таким каким оно было до присваивания. Значение Signature вычисляется, и в коде ассемблера ему присваивается определенное значение...

Как разрешить эту проблему? Заранее благодарен...


 
Digitman ©   (2005-02-24 14:08) [1]

для начала убери строчку

 mov Signature, eax


 
DAT   (2005-02-24 14:38) [2]

нет не работает... да и не в этом дело (то что результаты ассемблерных функций накапливаются в ЕАХ - это мне известно). Что-то мне подсказывает, что проблема в адресации... ведь директива db пишет в сегмент кода данные, что в общем-то противоречит паскалевскому принципу объявления переменных.. Но все же решения проблемы я пока не нашел...


 
DiamondShark ©   (2005-02-24 14:55) [3]

Если этот фрагмент -- часть метода формы, то запись в EAX разрушает параметр Self.
Соответственно, вызов StaticText1.Caption (который на самом деле Slef.StaticText1.Caption) происходит по указателю в светлое будущее.


 
Digitman ©   (2005-02-24 14:55) [4]


> StaticText1.Caption остается прежним, таким каким оно было
> до присваивания


вот уж не ври !

если ДО выполнения строчки

StaticText1.Caption:=IntToHex(Signature,4)

значение StaticText1.Caption было равно "", то ПОСЛЕ УСПЕШНОГО выполнения этой строчки значение StaticText1.Caption НИКАК НЕ может быть равным "" .. в ЛЮБОМ случае какую-то цифирь ты там увидишь)


 
DiamondShark ©   (2005-02-24 15:05) [5]

А он и не врёт.
После выполнения ассемблерного франмета нету у него больше никакого StaticText1.
Не, что-то куда-то, конечно же, записывается...


 
DAT   (2005-02-24 15:09) [6]

с учетом рекомендаций DiamondShark:

procedure TForm1.Button1Click(Sender: TObject);
var Signature:integer;
begin
asm
  push eax
  mov eax, 1
  db 0fh
  db 0a2h
  mov Signature, eax
  pop eax
end;

StaticText1.Caption:=IntToHex(Signature,4);
end;


не работает! до этого сохранял все возможные регистры (сегментов данных, стека, указатели, индексы...) в стеке, результат тот же, т.е. "без такого же успеха" (Жванецкий).

В чем же дело, а?


 
Digitman ©   (2005-02-24 15:10) [7]


> DiamondShark ©   (24.02.05 15:05) [5]


> А он и не врёт


мож и не врет, если твое предположение насчет "этот фрагмент -- часть метода формы" подтверждается


 
Digitman ©   (2005-02-24 15:15) [8]

Opcode Instruction Description
0F A2
CPUID Returns processor identification and feature information
to the EAX, EBX, ECX, and EDX registers, according to
the input value entered initially in the EAX register


 
Digitman ©   (2005-02-24 15:18) [9]


> DAT   (24.02.05 15:09) [6]


дурью не майся, ничего ты на инлайн-коде не сэкономишь в дан.случае

оформи чтение ид-ра ЦП в виде отдельной ф-ции, возвращающей рез-т в виде 16-байтной структуры


 
DiamondShark ©   (2005-02-24 15:22) [10]

cpuid изменяет регистры EAX, EBX, EDX. Все они должны быть сохранены.

procedure TForm1.Button1Click(Sender: TObject);
var Signature:integer;
begin
asm
 push eax
 push ebx
 push edx
 mov eax, 1
 db 0fh
 db 0a2h
 mov Signature, eax
 pop edx
 pop ebx
 pop eax
end;

StaticText1.Caption:=IntToHex(Signature,4);
end;

Так работает.


 
DiamondShark ©   (2005-02-24 15:28) [11]

Вот, нашёл:
An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers.

А EBX как раз и меняется.


 
DAT   (2005-02-24 15:32) [12]

2 DiamondShark ©

Спасибо, таки ЕВХ!


 
Digitman ©   (2005-02-24 15:40) [13]


> DAT   (24.02.05 15:32) [12]


угу .. мануал от Интела, конечно же, - для лабухов ... не для кудрявых программистов ...

нет бы сразу почитать и вникнуть !


 
DAT   (2005-02-24 16:13) [14]


> Digitman ©   (24.02.05 15:40) [13]


ты не понял: я не романтик процесса разработки, а бесчувственный эксплуататор интеллектуальных достижений в этой области.

Всем спасибо, кудрявые!


 
Digitman ©   (2005-02-24 16:16) [15]


> DAT   (24.02.05 16:13) [14]


> я не романтик процесса разработки


лабухи, кстати, и есть далеко не романтики) ... лабухам как раз статус "прагматиков" (или как ты изволил выразиться - "бесчувственных эксплуататоров интеллектуальных достижений") более подходит) ... на то они и лабухи)



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
14-1109088492
}|{yk
2005-02-22 19:08
2005.03.13
Тестирование кода


1-1109267654
aglar
2005-02-24 20:54
2005.03.13
Как сохранить динамически созданные пункты меню?


1-1109695572
Shnabs
2005-03-01 19:46
2005.03.13
Курсор


4-1107195222
Ландграф Павел
2005-01-31 21:13
2005.03.13
Ввести в поле чужой программы свой текст


14-1108901620
kaZaNoVa
2005-02-20 15:13
2005.03.13
PHP-качалка сайтов