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

Какие регистры сохранять в соглашении о вызовах ARM C?
Прошло много времени с тех пор, как я в последний раз кодировал ассемблер для рук, и я немного заржавел в деталях. Если я вызываю функцию C из arm, мне нужно беспокоиться только о сохранении r0-r3 и lr, верно? Если функция C использует какие-либо...
76255 просмотров

Вызов функции, которая может быть либо cdecl, либо stdcall
Мне нужно написать код, который вызывает внешнюю функцию, которая может быть вызовом stdcall или cdecl в 32-битном приложении Windows. Мой код, вызывающий объект, не может знать заранее, какой из них будет. Прямо сейчас, если я попытаюсь вызвать...
441 просмотров

Как запустить поток с функцией другого соглашения о вызовах
Ссылаясь на эту публикацию , я есть чистый виртуальный класс: #define CALL __stdcall class IIEvent { virtual ~IIEvent() {} virtual void CALL ev1(int) = 0; virtual void CALL ev2(int) = 0; }; Этот интерфейс используется для...
141 просмотров

gcc 4.7.2 в Debian wheezy не всегда правильно выравнивает указатель стека. Это ошибка?
Случайно, читая ассемблерный листинг примера программы на C, я заметил, что указатель стека не выровнен по 16 битам перед вызовом функции foo: void foo() { } int func(int p) { foo(); return p; } int main() { return func(1); } func: pushq...
136 просмотров
schedule 15.02.2024

Как правильно вызвать функцию Win32/64 из LLVM?
Я пытаюсь вызвать метод из LLVM IR обратно в код C++. Я работаю в 64-битном Visual C++ или, как это описывает LLVM: Machine CPU: skylake Machine info: x86_64-pc-windows-msvc Для целых типов и типов указателей мой код отлично...
801 просмотров
schedule 30.01.2024

Сборка ARM - параметр доступа и возвращаемое значение?
У меня есть прототип функции int Palindrome(const char *c_style_string); В сборке ARM v8 я считаю, что параметр хранится в регистре w0. Однако разве это не тот регистр, значение которого ret выводит? Если да, то что мне нужно сделать, чтобы...
875 просмотров

Почему параметры системного вызова Assembly x86_64 не в алфавитном порядке, как i386
Есть один вопрос, который меня беспокоит. Итак... Почему в x86_32 параметры передаются в регистры, которые, как мне кажется, расположены в алфавитном порядке ( eax , ecx , edx , esi ) и рейтинг ( esi , edi , ebp )...
1730 просмотров

Распределение стека слишком велико
Я написал ниже код. int main (int argc, char *argv[]) { char *uargv[3]; uargv[0] = "echo"; uargv[1] = "hello!"; uargv[2] = 0; exec("echo", uargv); exit(); } И скомпилирован с помощью gcc 5.4. Ниже приведен ассемблерный код...
79 просмотров
schedule 08.12.2022

почему функция printf показывает желаемый результат в следующем коде?
#include <iostream> #include <cstdio> using namespace std; int main() { int a=1; printf("%d\t%d\t%d\n",a,++a,a++); return 0; } Почему вывод кода 3 3 1 . кто-нибудь объяснит мне, как происходит такой вывод?
52 просмотров
schedule 10.04.2024

Сохранение реестра msvc 2017 x64
Согласно https://docs.microsoft.com/ru-ru/cpp/build/x64-software-conventions?view=vs-2017 — xmm6:xmm15 энергонезависимы. Но моя программа не падает, если я не сохраняю xmm6, xmm7. Я не вызываю ОС из сборки. Нужно ли сохранять регистры в этом...
166 просмотров

Как получить аргумент из стека в сборке x64?
Пытаюсь написать процедуру на x64 сборке. Я вызываю это в основной программе, написанной на C ++. Я передаю несколько параметров. Я знаю, что первые 4 будут в определенных регистрах, а остальные (должны быть) в стеке. Более того, я читал, что...
482 просмотров

Вызов sprintf в сборке x64
Кажется, я не могу правильно вызвать sprintf() в ассемблере. Когда я пытаюсь dprintf() отформатировать свой буфер, все, что я получаю, это: (null) и ошибка сегментации. При запуске lldb с моей программой причиной сбоя является...
139 просмотров

Ошибка сегментации программы сборки Hello world
Почему я получаю ошибку: Ошибка сегментации (дамп ядра) Вот код сборки: .intel_syntax noprefix .data message: .asciz "Hello World!\n" .text .global main main: lea rdi, message call printf ret
84 просмотров
schedule 22.03.2024