Форум: "Основная";
Текущий архив: 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