fastcall и адресация

Тема в разделе "WASM.BEGINNERS", создана пользователем SlaVVVa, 7 фев 2023.

  1. SlaVVVa

    SlaVVVa New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2022
    Сообщения:
    10
    Что если из первого параметра функции __fastcall взять адрес (он же в регистре edx)?
    Как будет внутри устроен код?
     
  2. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    444
    Сохранится в стек и возьмётся адрес.
     
  3. SlaVVVa

    SlaVVVa New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2022
    Сообщения:
    10
    Если так просто, то как тогда функции с переменным числом параметров работают с __fastcall ?
    Вот кусок кода после компилятора дизассемблированный. edx вроде не используется...
    void __fastcall fx2(tt d) {
    00CC2410 push ebp
    00CC2411 mov ebp,esp
    00CC2413 sub esp,0CCh
    00CC2419 push ebx
    00CC241A push esi
    00CC241B push edi
    00CC241C push ecx
    00CC241D lea edi,[ebp-0Ch]
    00CC2420 mov ecx,3
    00CC2425 mov eax,0CCCCCCCCh
    00CC242A rep stos dword ptr es:[edi]
    00CC242C pop ecx
    00CC242D mov ecx,offset _959A5CFF_ConsoleApplication5@cpp (0CCE029h)
    00CC2432 call @__CheckForDebuggerJustMyCode@4 (0CC1370h)
    int nu =(int) &d;
    00CC2437 lea eax,[d]
    00CC243A mov dword ptr [nu],eax
    }

    Может он параметры через стек передавать начал и изменил тип(прототип) функции?
     
  4. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    444
    Судя по всему для variadic он просто отменяет __fastcall.
     
  5. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    141
    Не по теме. А зачем компилятору Push eCx... Pop eCx.. ?
     
    SlaVVVa нравится это.
  6. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    444
    Отладка же. Отладке в оптимизацию не смотрят.
    --- Сообщение объединено, 7 фев 2023 ---
    https://devblogs.microsoft.com/oldnewthing/20131128-00/?p=2543
    Да, кстати
    Вариадикам просто тихо подменяется на __cdecl, это единственное соглашение о вызовах поддерживаемое вариадиками.
     
    SlaVVVa нравится это.
  7. SlaVVVa

    SlaVVVa New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2022
    Сообщения:
    10
    блин понял в чём косяк ... передавал структуру - а она сразу в стек при любом раскладе...
    - это верно
    а __fastcall работает потому, что при ... аргументе скорее всего его тоже в стек ложит
    --- Сообщение объединено, 7 фев 2023 ---
    ценнейшая информация - сам бы не нашёл
    --- Сообщение объединено, 7 фев 2023 ---
    а можно как-то без отладки посмотреть? (при Release всё сразу оптимизирует и убирает)
     
  8. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    444
    Агрессивные оптимизации могут всё выкинуть, можно их побороть как нибудь типа взять указатель на функцию и скормить куда нибудь как параметр чтобы компилятор не был уверен что функция никем не используется.