PDA

Показать полную графическую версию : asm to pas


Mavlyudov
16-05-2005, 02:25
народ, помогите перевести функцию на язык паскаль, чтобы ее можно, а то я не знаю аччемблер и не понимаю что здесь написано!!

function KeyPressed(VKey: Integer): LongBool;
asm
push eax
call GetKeyState
and eax, 0080h
shr al, 7
end;

Savant
16-05-2005, 03:35
Mavlyudov
Если честно, то не понимаю, чем Вас не устроила прекрасная ассемблерная реализация...
Ну да ладно, вот паскаль:

function KeyPressed(VKey: Integer): LongBool;
begin
Result := (Byte(GetKeyState(VKey) and $0080) shr 7) = 1;
end;

hasherfrog
16-05-2005, 09:42
Savant По-моему, "= 1;" не нужно. И приведение к Byte тоже. Да и shr тоже :]
ИМО, что-то типа
function KeyPressed(VKey: Integer): LongBool;
begin
Result := (GetKeyState(VKey) and $0080) <> 0;
end;

P.S. Если это скомпилить, получиться код больше данного ассемблерного.
Но ведь смысл не в этом, так?

Savant
16-05-2005, 16:54
hasherfrog, ни с чем не спорю :]. Cам вижу, что в три ночи спать надо, а не по ИНету шастать

Mavlyudov
Кстати говоря:
не понимаю что здесь написано!!

function KeyPressed(VKey: Integer): LongBool;
asm
// Ассемблерные функции в паскале используют механизм вызова register,
// при котором для передачи параметров используются три расширенных
// регистра процессора (EAX, EDX и ECX) и только потом стек, поэтому
// VKey сразу оказывается в EAX. Команда push eax кладет значение VKey
// в стек для функции GetKeyState, которая вызывается по стандартному
// в Win методу stdcall
push eax
// Собственно вызов функции GetKyState
call GetKeyState
// Функция возвращает свое значение в регистре EAX. В SDK сказано, что
// "If the high-order bit is 1, the key is down; otherwise, it is up".
// Значит нам надо оставить только 16-й разряд (бит) слева, причем при
// использовании операции and eax, 0080h он "останется" с тем же
// значением, что и был.
and eax, 0080h
// А вот здесь я в замешательстве. Эта команда в данном случае просто
// бесполезна, так как ничего не меняет в результате и ее можно
// спокойно закомментировать
// shr al, 7
// Результат выполнения возвращается в EAX
end;

pva
17-05-2005, 14:52
Здесь считается, что GetKeyState возвращает signed byte, поэтому код такой странный. Я бы написал (и всегда пишу) так:

if (GetKeyState(key) < 0) then ... // pressed

или, на ассемблере:

push key
call GetKeyState
cmp eax, 0
// в флаге переноса бит, указывающий на нажатие
// не помню инструкцию загрузки CF в al

Так это обычно делает компилятор C++ в дебуге.




© OSzone.net 2001-2012