Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   asm to pas (http://forum.oszone.net/showthread.php?t=49336)

Mavlyudov 16-05-2005 02:25 324418

asm to pas
 
народ, помогите перевести функцию на язык паскаль, чтобы ее можно, а то я не знаю аччемблер и не понимаю что здесь написано!!

Код:

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


Savant 16-05-2005 03:35 324430

Mavlyudov
Если честно, то не понимаю, чем Вас не устроила прекрасная ассемблерная реализация...
Ну да ладно, вот паскаль:
Код:

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


hasherfrog 16-05-2005 09:42 324474

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 324642

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 324948

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

    if (GetKeyState(key) < 0) then ... // pressed
или, на ассемблере:
Код:

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

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


Время: 01:38.

Время: 01:38.
© OSzone.net 2001-