Код (Text): #include "stdafx.h" #include <iostream> using namespace std; extern "C" int IntegerAddSub_(int a, int b, int c, int d); static void PrintResult(const char* msg, int a, int b, int c, int d, int result) { const char nl = '\n'; cout << msg << nl; cout << "a = " << a << nl; cout << "b = " << b << nl; cout << "c = " << c << nl; cout << "d = " << d << nl; cout << "результат = " << result << nl; cout << nl; } int main() { int a, b, c, d, result; a = 10; b = 20; c = 30; d = 18; result = IntegerAddSub_(a, b, c, d); PrintResult("Пример 1", a, b, c, d, result); a = 101; b = 34; c = -190; d = 25; result = IntegerAddSub_(a, b, c, d); PrintResult("Пример 2", a, b, c, d, result); return 0; } ;------------------------------------------------- ; Ch02_01.asm ;------------------------------------------------- ; extern "C" int IntegerAddSub_(int a, int b, int c, int d); .code IntegerAddSub_ proc ; Вычисление a + b + c - d mov eax,ecx ;eax = a add eax,edx ;eax = a + b add eax,r8d ;eax = a + b + c sub eax,r9d ;eax = a + b + c – d ret ;отправка результата вызывающей функции IntegerAddSub_ endp end Книга Куссвюрм Д. - Профессиональное программирование на ассемблере. В данном примере компилятор C++ генерирует код, который загружает значения a, b, c и d в регистры ECX, EDX, R8D и R9D соответственно до вызова функции IntegerAddSub_. Вопрос в том - почему именно в эти регистры загружает значения и в такой последовательности, а не в другие? Где эти правила загрузки? Например четко сказано, что EAX всегда возвращает значение вызывающей функции, но почему именно эти регистры принимают значения в функции?
"Соглашение о вызовах" это называется. Писаный закон. https://learn.microsoft.com/ru-ru/cpp/build/x64-calling-convention