calling-convention
Я программирую JIT-компилятор и был удивлен, обнаружив, что так много регистров x86-64 являются энергонезависимыми (сохраненными вызываемыми) в соглашении о вызовах Win64. Мне кажется, что энергонезависимые регистры просто больше работают во всех функциях, которые могли бы использовать эти регистры. Это кажет...
Я разрабатываю виртуальную машину и хотел бы сделать возможным вызов скомпилированных функций. Однако, поскольку каждая функция может иметь различную сигнатуру, мой план состоит в том, чтобы обобщить все вызовы на 2 возможных сценария - вызов функции без возврата и без параметров и вызов функции, которая прин...
(Microsoft) x64 соглашение о вызовах гласит: Аргументы передаются в регистрах RCX, RDX, R8 и R9. Если аргументы float / double, они передаются в XMM0L, XMM1L, XMM2L и XMM3L. Это здорово, но почему просто плавает/удваивается? Почему целые числа (и, возможно, указатели) также не передаются через регистр...
Единственное, что я знаю о механизме передачи значений C, это то, что это делается либо через регистр, либо через стек. Регистр или стек? Но как именно?...
Например int foo(short x); short s = -1; foo(s); Это то же самое, что //int foo(short x); //Updated int foo(signed x); short s = -1; foo((signed)s);//sign-extend and push to stack Или это то же самое, что //int foo(short x); //Updated int foo(unsigned) short s = -1; foo((unsigned)(unsigned short)...
Я понимаю соглашения о вызовах для передачи 32-битных и 64-битных целых чисел (и указателей), плавающих и двойных чисел для 64-битного кода для Micrsoft и System V AMD64 ABI. Но мне не ясно, какие соглашения о вызовах существуют для составных типов данных. Чтобы быть более ясным, каковы соглашения о вызовах ...
Я пытаюсь вызвать следующую функцию: long long RtlLargeIntegerDivide(long long dividend, long long divisor, long long* pRemainder) В ассемблерном коде (NASM). Он использует соглашение о вызове stdcall и возвращает частное. Это спецификации: Входные данные: [EDX, EAX] (дивиденд), [ECX, EBX] (делитель) ...
в настоящее время я разрабатываю библиотеку C++ для Windows, которая будет распространяться как DLL. Моя цель-максимизировать двоичную совместимость; точнее, функции в моей DLL должны использоваться из кода, скомпилированного с несколькими версиями MSVC++ и MinGW без необходимости перекомпилировать DLL. Однак...
я наткнулся __stdcall много в эти дни. MSDN не очень ясно объясняет, что это на самом деле означает, когда и почему его следует использовать, если вообще. Я был бы признателен, если кто-то даст объяснение, желательно с примером или два....