Передача значений аргументов функции. Вопрос.

Тема в разделе "WASM.BEGINNERS", создана пользователем deletant, 20 ноя 2024 в 08:43.

  1. deletant

    deletant New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2023
    Сообщения:
    5
    Код (Text):
    1. #include "stdafx.h"
    2. #include <iostream>
    3. using namespace std;
    4. extern "C" int IntegerAddSub_(int a, int b, int c, int d);
    5. static void PrintResult(const char* msg, int a, int b, int c, int d, int result)
    6. {
    7. const char nl = '\n';
    8. cout << msg << nl;
    9. cout << "a = " << a << nl;
    10. cout << "b = " << b << nl;
    11. cout << "c = " << c << nl;
    12. cout << "d = " << d << nl;
    13. cout << "результат = " << result << nl;
    14. cout << nl;
    15. }
    16. int main()
    17. {
    18. int a, b, c, d, result;
    19. a = 10; b = 20; c = 30; d = 18;
    20. result = IntegerAddSub_(a, b, c, d);
    21. PrintResult("Пример 1", a, b, c, d, result);
    22. a = 101; b = 34; c = -190; d = 25;
    23. result = IntegerAddSub_(a, b, c, d);
    24. PrintResult("Пример 2", a, b, c, d, result);
    25. return 0;
    26. }
    27. ;-------------------------------------------------
    28. ; Ch02_01.asm
    29. ;-------------------------------------------------
    30. ; extern "C" int IntegerAddSub_(int a, int b, int c, int d);
    31. .code
    32. IntegerAddSub_ proc
    33. ; Вычисление a + b + c - d
    34. mov eax,ecx ;eax = a
    35. add eax,edx ;eax = a + b
    36. add eax,r8d ;eax = a + b + c
    37. sub eax,r9d ;eax = a + b + c – d
    38. ret ;отправка результата вызывающей функции
    39. IntegerAddSub_ endp
    40. end
    Книга Куссвюрм Д. - Профессиональное программирование на ассемблере. В данном примере компилятор C++ генерирует
    код, который загружает значения a, b, c и d в регистры ECX, EDX, R8D и R9D соответственно до вызова функции IntegerAddSub_.
    Вопрос в том - почему именно в эти регистры загружает значения и в такой последовательности, а не в другие? Где эти правила загрузки? Например четко сказано, что EAX всегда возвращает значение вызывающей функции, но почему именно эти регистры принимают значения в функции?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.997
    "Соглашение о вызовах" это называется. Писаный закон.
    https://learn.microsoft.com/ru-ru/cpp/build/x64-calling-convention
     
    Mikl___ и deletant нравится это.
  3. Mikl___

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

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