Вопросы по теме 'calling-convention'

Что такое __stdcall?
Я изучаю программирование на Win32, а прототип WinMain выглядит так: int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show ) Я был сбит с толку, для чего был нужен этот WINAPI идентификатор, и...
116003 просмотров
schedule 09.07.2022

Почему Mac ABI требует выравнивания стека по 16 байт для x86-32?
Я могу понять это требование для старых систем PPC RISC и даже для x86-64, но для старого проверенного x86? В этом случае стек необходимо выровнять только по 4-байтовым границам. Да, некоторые инструкции MMX / SSE требуют 16-байтового выравнивания,...
7236 просмотров

Пользовательское соглашение о вызовах X86_64 для вызова функции C
Мне нужно создать интерфейс (скажем, оболочку), который разрешает вызов из ассемблерного кода X86_64, используя его соглашение о вызовах для функции C, с другим соглашением о вызовах. Лучше всего было бы быть довольно "независимым от компилятора"...
4009 просмотров
schedule 13.01.2023

Изменение соглашения о вызовах с cdecl на stdcall
В VS2005 я использовал соглашение о вызовах _cdecl, и проект строится без каких-либо ошибок компоновщика. После того, как я изменил соглашение о вызовах на _stdcall при переносе проекта на VS2008, я получаю следующую ошибку: ошибка LNK2001:...
2756 просмотров
schedule 12.11.2022

Соглашение __fastcall в С#
Учитывая, что: Специально для Майкрософт Соглашение о вызовах __fastcall указывает, что аргументы функций должны передаваться в регистрах, когда это возможно. В следующем списке показана реализация этого соглашения о вызовах. И что...
2030 просмотров
schedule 26.09.2022

В чем преимущество использования энергонезависимых регистров в соглашении о вызовах?
Я программирую JIT-компилятор и с удивлением обнаружил, что многие из регистров x86-64 энергонезависимы (сохраняются вызываемым) в соглашении о вызовах Win64. Мне кажется, что энергонезависимые регистры просто увеличивают объем работы всех функций,...
1376 просмотров
schedule 06.03.2023

EBP, ESP и стековая рама в сборе
У меня есть несколько вопросов о EBP, ESP и кадре стека в следующем коде. Почему мы вычли 28 из esp? У нас есть две локальные переменные x и y в main. Так почему мы не вычли 8? И разве мы не помещаем значения в стек справа (или сверху)...
9161 просмотров

При вызове C из MIPS мы используем JR или JALR?
Я пишу самомодифицирующийся код и хочу вызвать функцию C (назовем ее foo ) из MIPS. Я загрузил добавление памяти foo , &foo в $t1 . Сейчас я jr/jalr $t1 . Будет ли C устанавливать $ra в качестве моего текущего ПК(+8) (до прыжка),...
905 просмотров
schedule 18.09.2022

Вызов функции Sleep Win32 из сборки создает ошибку нарушения прав доступа
Я использую MASM и Visual C++ и компилирую в x64. Это мой код на С++: // include directive #include "stdafx.h" // external functions extern "C" int Asm(); // main function int main() { // call asm Asm(); // get char, return success...
3215 просмотров
schedule 08.09.2023

Segfault при вызове функции C (printf) из сборки
Я использую NASM в Linux для написания базовой программы сборки, которая вызывает функцию из библиотек C (printf). К сожалению, при этом у меня возникает ошибка сегментации. Комментирование вызова printf позволяет программе работать без ошибок....
1247 просмотров
schedule 01.11.2022

В каких случаях компилятору C разрешено игнорировать соглашения о вызовах?
По понятным причинам компилятор C должен скомпилировать все функции, видимые извне для других разделяемых библиотек, чтобы они соответствовали соглашениям о вызовах платформы и другим требованиям ABI. Однако я узнал, что это не обязательно нужно...
152 просмотров

Почему код ассемблера __fastcall больше, чем код __stdcall в MS C++?
Я разобрал два разных варианта функции Swap (простой обмен значениями между двумя указателями). 1). __fastcall http://pastebin.com/ux5LMktz 2). __stdcall (функция без явного модификатора соглашения о вызовах по умолчанию будет иметь...
506 просмотров

Как перейти к другой функции в c?
В основном я пытаюсь смоделировать ассемблерный код на языке C. Вот код C: int main() { test(); main_next: printf("Hello, World!"); } void test() { goto main_next; } Пытаясь скомпилировать этот код (32-разрядная версия Linux,...
8922 просмотров
schedule 27.04.2022

Соглашение о вызовах FORTRAN DLL от MapleSim/Modelica
Язык моделирования Modelica поддерживает вызов функций из внешних DLL на FORTRAN, однако MapleSim включает только поддержку вызова функций из DLL на C, даже несмотря на то, что заявлена ​​полная поддержка языка Modelica, и у меня нет другого выбора,...
314 просмотров
schedule 18.10.2023

Pythonic способ эффективно обрабатывать переменное количество возвращаемых аргументов
Итак, у меня есть функция, которая может работать либо тихо, либо многословно. В тихом режиме он производит вывод. В подробном режиме он также сохраняет промежуточные вычисления в список, хотя это само по себе требует дополнительных вычислений....
284 просмотров

Использование GetProcAddress, когда имя может быть украшено
Как правильно использовать GetProcAddress() в 32-битной DLL? В win32 есть три соглашения о вызовах: cdecl, stdcall и fastcall. Если функция в DLL - foo , они будут украшать имя следующим образом _foo , _foo@N и @foo@N . Но если автор dll...
1002 просмотров

Разница между EAX, 1 и EBX, 1 в сборке?
section .text global _start ;must be declared for linker (ld) _start: ;tell linker entry point mov edx,len ;message length mov...
4214 просмотров

Индексирование аргументов в виде массива в Windows x86-64 ABI
Я пытаюсь перенести функцию-оболочку с 32-битной на x86-64 asm для Windows ABI. Функция зависит от индексации своих аргументов в виде массива. Я знаю, что MSVC не может выполнять встроенную сборку в проектах X64, но мне интересно встроить...
246 просмотров

Встроенные функции и соглашения о вызовах
Есть ли смысл указывать соглашение о вызовах для встроенной функции? Например, я пишу математическую библиотеку SIMD, где рекомендуется использовать __vectorcall , но все мои функции встроены. В некоторых статьях я видел, как люди встраивают все...
507 просмотров

.seh_stackalloc и выравнивание стека
Я пишу сборку x64 для ассемблера GNU. Я пытался читать о директивах .seh_*, но не нашел о них много информации. В документах gas они вообще не упоминаются. Но насколько я понимаю, если мой код может оказаться в стеке во время операции...
458 просмотров