![]() |
asm to pas
народ, помогите перевести функцию на язык паскаль, чтобы ее можно, а то я не знаю аччемблер и не понимаю что здесь написано!!
Код:
function KeyPressed(VKey: Integer): LongBool; |
Mavlyudov
Если честно, то не понимаю, чем Вас не устроила прекрасная ассемблерная реализация... Ну да ладно, вот паскаль: Код:
function KeyPressed(VKey: Integer): LongBool; |
Savant По-моему, "= 1;" не нужно. И приведение к Byte тоже. Да и shr тоже :]
ИМО, что-то типа Код:
function KeyPressed(VKey: Integer): LongBool; Но ведь смысл не в этом, так? |
hasherfrog, ни с чем не спорю :]. Cам вижу, что в три ночи спать надо, а не по ИНету шастать
Mavlyudov Кстати говоря: Цитата:
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; |
Здесь считается, что GetKeyState возвращает signed byte, поэтому код такой странный. Я бы написал (и всегда пишу) так:
Код:
if (GetKeyState(key) < 0) then ... // pressed Код:
push key |
Время: 01:38. |
Время: 01:38.
© OSzone.net 2001-