Уточнение по передачи аргументов

Тема в разделе "WASM.X64", создана пользователем Entropy, 15 авг 2022.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    140
    Насколько я верно понимаю то чтобы передать оставшиеся аргументы через стек,нужно к регистру RSP прибавлять смещение,только вот я не знаю сколько именно нужно прибавлять
     
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.395
    Entropy,
    зависит от того, какие аргументы передаются, вещественные через регистры XMM0-XMM3, целочисленные через регистры RCX, RDX, R8, R9, далее через стек. Допустим, у тебя 10 целочисленных аргументов, которые представляют из себя константы,
    Код (ASM):
    1. sub rsp,50h ;<-- резервируем место для аргументов в стеке
    2. mov [rsp+48h],arg10
    3. mov [rsp+40h],arg9
    4. mov [rsp+38h],arg8
    5. mov [rsp+30h],arg7
    6. mov [rsp+28h],arg6
    7. mov [rsp+20h],arg5
    8. mov r9,arg4
    9. mov r8,arg3
    10. mov rdx,arg2
    11. mov rcx,arg1
    12. call foo
    13. add rsp,50h;<-- чистим в стеке после себя
    обычно программист не "парится", а в fasm или masm использует макрос invoke
    Код (ASM):
    1. invoke foo,arg1,arg2,arg3,arg4,arg5,arg6,\
    2. arg7,arg8,arg9,arg10,arg11,arg12
     
  3. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    140
    Код (ASM):
    1. mov [rsp+20h],arg5
    20h + 8 и так по нарастающий аргумент за аргументом ?
    --- Сообщение объединено, 15 авг 2022 ---
    не спорю удобно,но я в целях обучения хочу понять
     
  4. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    269
    Можно полный код подсмотреть у компилятора: https://godbolt.org/z/n8h7re7Ge
    Код (C++):
    1. extern int func( int a, int b, int c, int d, int x, int y );
    2.  
    3. int test()
    4. {
    5.     return func( 10, 20, 30, 40, 50, 60 ) + 10;
    6. }
    Код (ASM):
    1. int test(void) PROC                                 ; test, COMDAT
    2. $LN4:
    3.         sub     rsp, 56                             ; 00000038H
    4.         mov     edx, 20
    5.         mov     DWORD PTR [rsp+40], 60                    ; 0000003cH
    6.         mov     DWORD PTR [rsp+32], 50                    ; 00000032H
    7.         lea     r9d, QWORD PTR [rdx+20]
    8.         lea     r8d, QWORD PTR [rdx+10]
    9.         lea     ecx, QWORD PTR [rdx-10]
    10.         call    int func(int,int,int,int,int,int)                  ; func
    11.         add     eax, 10
    12.         add     rsp, 56                             ; 00000038H
    13.         ret     0
    Т.е. сперва нам в целом нужно в стеке выделить место под 6 параметров (округлённых до 8 байт), что есть 48, но т.к. стек нужно поддерживать выровненным по 16, то добавляется 56, т.к. call поместив адрес возврата добъёт это как раз до 64 кратного 16.
    Далее суть происходящего можно описать как размещение всех параметров справа-налево с верхних адресов в нижние, но 4 последних (т.е. в списке аргументов - первых) из них разбрасывается по регистрам, хотя место под них и зарезервировано.
    Более того - под 4 параметра место всегда должно быть зарезервировано есть они или нет, поэтому даже вызов функции без параметров (без информации по оптимизации) будет сопровождаться sub rsp, 40 (опять таки как бы под 5 8-байтных параметров для выравнивания).
     
  5. R81...

    R81... Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    72
    Мне было бы проще макрорасширение invoke в листинге распечатать.
    P.S. не дорос до 64.
     
  6. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.002
    Адрес:
    подполье
    Разумеется, не дорос! Потому что ты перерос 64, бро! :download:
    Пора уже конпелировать полностью как ч64, так и! а не только лишь для
     

    Вложения:

    R81... нравится это.
  7. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    140
    aa_dav, понятно,спасибо