Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
3-1108234055
Andrey1234124
2005-02-12 21:47
2005.03.13
Русские символы в таблицах Interbase


9-1103402156
Goldseeker
2004-12-18 23:35
2005.03.13
Опять столкновения


14-1108800748
_lam
2005-02-19 11:12
2005.03.13
vcl.h


4-1107128420
Intelect
2005-01-31 02:40
2005.03.13
Как программно загрузить драйвер в память! SYS!


3-1108199545
Bogdan
2005-02-12 12:12
2005.03.13
Ошибка при запросе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский