Немогу начать :)

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 16 июн 2009.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    _http://msdn.microsoft.com/en-us/library/ms794533(printer).aspx

    Код (Text):
    1. include '%fasm%\win64a.inc' ; w.inc ???
    2.  
    3. start:
    4.         fastcall  [Sleep],10000
    5.         cdecl [ExitProcess],0
    6. data import
    7.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    8.         include '%fasm%\api\shell32.inc' ; ???
    9.         include '%fasm%\api\kernel32.inc' ; ???
    10.         include '%fasm%\equates\shell64.inc'
    11.         include '%fasm%\equates\kernel64.inc'
    12. end data
    Чего тут ещё нада?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    ыыы?
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Значиться без 'format PE64' нельзя! Понятно.
    cdecl - это не прёт, а fastcall всё же поддерживается! Ну собсно там так и написанно.
    а вот это для чего папки? :)
    ; include '%fasm%\equates\shell64.inc'
    ; include '%fasm%\equates\kernel64.inc'
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    человек пытается методом перебора и подстановок кода написать программу, не мешай ;)
     
  5. Semiono

    Semiono Member

    Публикаций:
    0
  6. Semiono

    Semiono Member

    Публикаций:
    0
    Проверил на системе. fastcall тоже не работает, только родной invoke исполняется как положено!
    Ну а stdcall не проходит даже кампиляцию, ато тут есть любители [Sleep] таких вещей ;-
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    сорри за оффтоп - шутка по поводу названия
    Две проблемы: 1) трезвый не могу начать, 2)пьяный не могу кончить
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    У меня на уме вертелось словечко, кончить. Однако, за это могут и отмодерировать! :)
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    invoke такой же родной, как fastcall. cdecl [ExitProcess] - это вообще круто. Хорошо еще, что ExitProcess. Я же тебе советовал демки посмотреть. При включении win64a.inc все заголовочные файлы для библиотечных 64-разрядных функций включаются автоматически, поэтому не нужны как раз-таки последние два включения, а не те, что перед ними. А в папке api фактически находятся файлы с таблицами импорта - они нужны для того, чтобы вручную не прописывать в таблице все используемые в программе api-функции. А вообще для лучшего пониманимания я бы посоветовал сначала написать простейшую программу с минимальным использованием макросов, а уже потом ознакомиться с содержимым макросов и примерами их использования. Не мешало бы ознакомиться и с бинарным интерфейсом обращения к библиотечным функциям. Может, после этого ты вообще отойдешь от использования всяких invoke-ов и fastcall-ов и начнешь использовать действительно родной call.
     
  10. Semiono

    Semiono Member

    Публикаций:
    0
    ; поэтому не нужны как раз-таки последние два включения,
    я это понял, просто стало интересно что за инклюды там.
    ; Может, после этого ты вообще отойдешь от использования всяких invoke
    это действительно интересно, однако на msdn я могу находить сишное описание,
    что быстрее можно воплотить в код так как есть. я пока не решаюсь влезть в стек
    и боюсь потратить время ничего не поняв, хотя от этого у меня и проблемы. :)
    ; Я же тебе советовал демки посмотреть
    я посмотрел, именно там я заметил, что даже fastcall нигде не было, всё как обычно!
    моя ошибка была лишь в том, что я format PE64 не включил, собсно ясно, так как это
    видимо создаёт stub x64, а в 32 битном видимо это дефолт, поэтому можно не указывать.

    Однако, как-то даже не интересно стало, что так и не попробовал fastcall вызвать :)
    "Given the expanded register set, using a FASTCALL methodology of calling convention and a RISC-based exception-handling model makes much more sense."
     
  11. murder

    murder Member

    Публикаций:
    0
    В этом нет ничего сложного, а знать соглашения о вызове необходимо.

    stdcall - вызывает функцию по адресу. Параметры заносятся в стек в обратном порядке то есть
    Код (Text):
    1. stdcall Beep,2000,100
    эквивалентно
    Код (Text):
    1. push 100
    2. push 2000
    3. call Beep
    invoke - вызывает функцию по соглашению stdcall из переменной расположенной в памяти то есть
    Код (Text):
    1. invoke Beep,2000,100
    эквивалентно
    Код (Text):
    1. push 100
    2. push 2000
    3. call [Beep]
     
  12. murder

    murder Member

    Публикаций:
    0
    cominvk - вызывает функцию по адресу, расположеному виртуальной таблице методов (VMT). Параметры заносятся в стек в обратном порядке, последним заносится указатель на экземпляр класса. Адрес экземпляра класса хранится в памяти.
    Код (Text):
    1. cominvk OPCServerList,EnumClassesOfCategories,3,CATIDS,esi,esi,EnumGUID
    Превратится в
    Код (Text):
    1. push EnumGUID
    2. push esi
    3. push esi
    4. push CATIDS
    5. push 3
    6. mov  eax,[OPCServerList]
    7. push eax
    8. mov  eax,[eax]
    9. call dword[eax+12] ;12 - это смещение метода EnumClassesOfCategories в виртуальной таблице
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Товарищи, речь идет о Win64. Там в первую очередь используется регистровая передача параметров. А в программах под Win32 я тоже использую простейший stdcall, который периодически изменяю в зависимости от используемого в конкретной программе способа вызова библиотечных функций (например, напрямую через таблицу или через заглушки вида jmp [ApiFunction]).

    В фасме формат выходного файла определяется именно директивой format внутри исходника. Дефолтом, насколько я знаю, используется flat binary / use16. Если ты где-то не увидел format PE, то возможно она скрыта в инклудах. stub - это лишь один из необязательных параметров format.
     
  14. Semiono

    Semiono Member

    Публикаций:
    0
    Я попробовал без него и увидел, что так работает, ну и решил что не нужно :)
    Хотя use16 меня не устраивает, тогда будем делать format PE иль use32 укажу.
    Порядок погрузки параметров в стек знаком с детства, хотя всякие директивы иль команды,
    видимо могут изменять этот прорядок, отсюда наверное всяки вариации invoke cinvoke, но с
    этим проще, так как это просто можно понять и запомнить. Но дело в другом!
    Откуда знать мне адрес? Причём в отношении, ну хотяб ExitProcess или Beep. Он что постоянный?
    Или его не надо знать? Или в Windows это регламентированно.
    На msdn только прототипы функций говорят.
    Точно так же теоретически понятно, что вместо памяти используем регистры, но в связи с использованием API это так же туманно, чем их заполнять - что передавать...
    Помню читал про DOS, там API =) порегистрово всё расписывалось куда-что как! Там другая тема кароче, ближе к асму, но практически не дающая ничего мне в WinAPI... Иль я не прав?

    cominvk - вот это я видел, думал глюк какой )) но после моих исследований cdecl постеснялся спросить, ато засмеют =)
    murder, всётаки ты хорошо про stdcall, объяснил кое что у меня прояснилось!
    Но надо будет это как-то с апи связать конкретно, ато из головы вошло и вышло в другое ухо будет.
     
  15. Semiono

    Semiono Member

    Публикаций:
    0
    Таблицы? 0_- вот чего мне не данно! Как их узнать?
     
  16. murder

    murder Member

    Публикаций:
    0
    Semiono
    Это когда будешь работать с COM-объектами.
     
  17. murder

    murder Member

    Публикаций:
    0
    http://www.wasm.ru/publist.php?list=15
     
  18. murder

    murder Member

    Публикаций:
    0
    Он в таблице импорта.
    Код (Text):
    1. data import
    2.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    3.         include '%fasm%\api\shell32.inc' ; ???
    4.         include '%fasm%\api\kernel32.inc' ; ???
    5.         include '%fasm%\equates\shell64.inc'
    6.         include '%fasm%\equates\kernel64.inc'
    В общем для win32 используется invoke. Win64 не знаю.
     
  19. Semiono

    Semiono Member

    Публикаций:
    0
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    stdcall на самом деле может быть определен любым способом. Традиционно это слово просто определяет порядок помещения параметров в стек. Лично я использую stdcall в виде:
    Код (Text):
    1.   stdcall ApiFunction, parameters
    Но в зависимости от текущей необходимости в разных программах за этой записью могут быть скрыты различные способы вызова.

    Далее тебе нужно почитать про формат таблицы экспорта. В конечном итоге все сводится к массиву двойных слов (PE) / учетверенных слов (PE64) с нулевым завершающим элементом для каждой библиотеки. До запуска программы каждый элемент массива (кроме терминатора) содержит ссылку на спец. структуру, содержащую имя функции и ее предполагаемый экспортный номер (может содержать 0, тогда настройка будет выполняться только по имени). В процессе запуска программы загрузчик заменяет в каждом элементе массива (кроме терминатора) ссылку на структуру, определяющую импортируемую функцию ее адресом. Таким образом, после настройки мы получаем массив с адресами импортируемых библиотечных функций. Если каждому элементу массива дать символическое имя, соответствующее функции, адрес которой находится в этом элементе, то вызов функции можно выполнять так:
    Код (Text):
    1.   call [ApiFunction] ; синтаксис fasm
    2.   ...
    3.   ApiFunction dd _ApiFunction ; после запуска здесь будет адрес функции
    4.   ...
    5.   _ApiFunction dw 0 ; экспортный номер или 0
    6.   db "ApiFunctionA", 0 ; нольтерм. строка с реальным именем функции
    Здесь все проще, чем в DOS:
    в rcx - первый параметр;
    в rdx - второй;
    в r8 - третий;
    в r9 - четвертый;
    далее в стеке.
    Важно помнить, что в стеке нужно резервировать место в том числе и для регистровых параметров, но помещать их в стек не надо. Если параметр, передаваемый в регистре, имеет разрядность меньше 64 бит, то для его передачи можно и не использовать весь 64-разрядный регистр, например, для 32-разрядных параметров можно использовать ecx, edx, r8d, r9d. Вот здесь вроде бы подробно разобрана фасмовская демка.