Вход в 64-х битную процедуру.

Тема в разделе "WASM.BEGINNERS", создана пользователем Hacker, 1 июл 2021.

  1. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Как?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    call
     
    Mikl___ нравится это.
  3. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Ничерта не понятно в чем вопрос.
     
    Mikl___ нравится это.
  4. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Я тебя найду... и тебя то же, а Марио пусть гуляет дальше.
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Вход в 64-битную процедуру?
     
  6. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Вы Уважаемые под Колобков и Колобих не прикидывайтесь.... пожалуйста
    --- Сообщение объединено, 1 июл 2021 ---
    Будет и другой вопрос: Как слинковать .obj с помощью gcc и т.п. на win64 используя динамические библиотеки user32 & kernel32
    --- Сообщение объединено, 1 июл 2021 ---
    Mikl___ KCAHDEP три X - это не ты случайно?
     
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Вы уважаемый вопрос конкретнее пишите, ответ вам нужен как бы. И никто не должен угадывать с полуслова, что вы там себе задумали.
    также, наверное, как и на х86. Или что именно не получается? Попробуйте сформулировать вопрос более коректно - что делал, как делал, что не вышло, какая ошибка..
     
    Mikl___ нравится это.
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    gcc -o kolobok.exe kolobok.o -luser32 - lkernel32
     
    M0rg0t и Hacker нравится это.
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Hacker,

    Вызов обычный процедурный или может быть вопрос про режим совместимости, те как вызвать 64 из под 86 - wow. Это популярная тема, режим гадания включить ?

    Если не хочешь норм сформулировать вопрос, то и ответ тебе не дадут. А есчо тебя маркернут негласно как какого то троля/муд-ка етк и больше тебе что то спрашивать смысла не будет.
     
  11. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    напомните, нужно ли в 64 битном режиме (fastcall ) сохранять RDI RSI RDX или это только stdcall?
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    rdx не нужно, через него один из параметров в функцию передается.
     
    M0rg0t нравится это.
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    M0rg0t,
    В ABI x64 регистры RBX, RBP, RDI, RSI, RSP, R12-15 и XMM6–15 должны быть сохранены и восстановлены с помощью функции, которая их использует.
    Целочисленные аргументы передаются в регистрах RCX, RDX, R8-9. Аргументы с плавающей запятой передаются в XMM0-3
    Результат возвращается в регистрах RAX, R10-11, XMM4-5
    https://docs.microsoft.com/ru-ru/cpp/build/x64-calling-convention?view=msvc-170
     
    M0rg0t нравится это.
  14. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Лучше поздно, чем никогда! Ответ на OP: [​IMG]
     
  15. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    rmn, да, точно, RBX.

    Mikl___, спасибо. про R12-15 не знал. Еще такой момент. Видел где-то в сорцах код вида
    Код (Text):
    1. enter 80h,0
    2. sub rsp,90h
    я помню, что в х64 нужно создавать стековый фрейм и туда дублировать аргументы процедуры (тут обсуждалось), но зачем код это делает дважды ? Ведь enter == sub rsp, или что-то путаю?
     
  16. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Дублировать аргументы не нужно. Надо просто выделить место под четыре регистра, через которые передаются параметры, чтобы функция в прологе могла их туда сохранить и использовать для чего-нибудь другого.
     
    M0rg0t нравится это.
  17. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Не для чего-нибудь, а тупо под аргументы для первого же вызова внутри процедуры. О - Оптимизация или Отложенное помещение аргументов в стек.
     
    M0rg0t нравится это.
  18. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Использование регистров для вызова функций прекрасно попадает в категорию "чего-нибудь" :)
     
  19. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Чувствую себя опять начинающим с 64 битным ассемблером. Появились еще вопросы:
    1. Работает ли стек также, как и раньше? Ну т.е. могу ли я сохранить там что-то через push и потом восстановить через pop, или какие-то винапи могут испортить стек? Вроде бред, но наблюдаю такое поведение.
    2. опять же стек, пишу процедуру вида

    Код (Text):
    1. lookup_api  proc  uses rdi rsi rbx
    2. sub rsp, 28h
    оно трансформируется в
    Код (ASM):
    1.  
    2. lookup_api  proc
    3. push rsi
    4. push rdi
    5. push rbx
    6. sub rsp, 28h
    7.  
    и потом эти регистры "теряются". Наверное, сначала надо выделить память на стеке а потом передавать эти регистры? Но почему сам масм так делает, на 32 бит же норм было.
    и нужно ли тогда выделять больше, чем 28h, если я туда еще пишу эти регистры?
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    M0rg0t,
    для временной переменной лучше (проще) создать локальную переменную в памяти. Через стек сохраняйте что-то там через push и потом восстанавливайте через pop если между push и pop нет винапи. Кроме того, перед вызовом системной процедуры значение rsp должно быть быть кратно 16, а push/pop сдвигают значение в rsp на 8
     
    M0rg0t нравится это.