Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » asm to pas

Ответить
Настройки темы
asm to pas

Пользователь


Сообщения: 74
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Savant
Дата: 16-05-2005
Описание: тег [code] не забываем
народ, помогите перевести функцию на язык паскаль, чтобы ее можно, а то я не знаю аччемблер и не понимаю что здесь написано!!

Код: Выделить весь код
function KeyPressed(VKey: Integer): LongBool;
asm
  push eax
  call GetKeyState
  and eax, 0080h
  shr al, 7
end;

-------
Mavlyudov


Отправлено: 02:25, 16-05-2005

 

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Mavlyudov
Если честно, то не понимаю, чем Вас не устроила прекрасная ассемблерная реализация...
Ну да ладно, вот паскаль:
Код: Выделить весь код
function KeyPressed(VKey: Integer): LongBool;
begin
  Result := (Byte(GetKeyState(VKey) and $0080) shr 7) = 1;
end;

Отправлено: 03:35, 16-05-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Savant По-моему, "= 1;" не нужно. И приведение к Byte тоже. Да и shr тоже :]
ИМО, что-то типа
Код: Выделить весь код
function KeyPressed(VKey: Integer): LongBool;
begin
  Result := (GetKeyState(VKey) and $0080) <> 0;
end;
P.S. Если это скомпилить, получиться код больше данного ассемблерного.
Но ведь смысл не в этом, так?

Отправлено: 09:42, 16-05-2005 | #3


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


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;

Отправлено: 16:54, 16-05-2005 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Здесь считается, что GetKeyState возвращает signed byte, поэтому код такой странный. Я бы написал (и всегда пишу) так:
Код: Выделить весь код
    if (GetKeyState(key) < 0) then ... // pressed
или, на ассемблере:
Код: Выделить весь код
   push key
   call GetKeyState
   cmp eax, 0
   // в флаге переноса бит, указывающий на нажатие
   // не помню инструкцию загрузки CF в al
Так это обычно делает компилятор C++ в дебуге.

Отправлено: 14:52, 17-05-2005 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » asm to pas

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Delphi - зачем DCC32.EXE нужны system.pas, sysinit.pas, *.dpr ? akrav Программирование и базы данных 4 12-05-2008 14:25
Народ помогите разобраться в asm'e! novichek_new Программирование и базы данных 8 30-12-2005 18:55
Память, asm и BSD Guest Программирование и базы данных 1 19-09-2004 22:40
Asm in freeBSD Guest Программирование и базы данных 1 14-06-2004 18:08
pas в модуль exe или com cheap Программирование и базы данных 8 26-11-2003 05:32




 
Переход