Ошибка сегментации при вызове функции сборки x86 из программы C

Я пишу программу на C, которая вызывает функцию сборки x86, которая складывает два числа. Ниже представлено содержимое моей программы на C (CallAssemblyFromC.c):

#include <stdio.h> #include <stdlib.h> int addition(int a, int b); int main(void) { int sum = addition(3, 4); printf(«%d», sum); return EXIT_SUCCESS; }

Ниже приведен код функции Assembly (моя идея состоит в том, чтобы закодировать с нуля пролог и эпилог кадра стека, я добавил комментарии, объясняющие логику моего кода) (add.s):

.text # Here, we define a function addition .global addition addition: # Prologue: # Push the current EBP (base pointer) to the stack, so that we # can reset the EBP to its original state after the function’s # execution push %ebp # Move the EBP (base pointer) to the current position of the ESP # register movl %esp, %ebp # Read in the parameters of the addition function # addition(a, b) # # Since we are pushing to the stack, we need to obtain the parameters # in reverse order: # EBP (return address) | EBP + 4 (return value) | EBP + 8 (b) | EBP + 4 (a) # # Utilize advanced indexing in order to obtain the parameters, and # store them in the CPU’s registers movzbl 8(%ebp), %ebx movzbl 12(%ebp), %ecx # Clear the EAX register to store the sum xorl %eax, %eax # Add the values into the section of memory storing the return value addl %ebx, %eax addl %ecx, %eax

Я получаю ошибку ошибки сегментации, что кажется странным, учитывая, что я думаю, что выделяю память в соответствии с соглашениями о вызовах x86 (например, выделение правильных разделов памяти параметрам функции). Кроме того, если у кого-то из вас есть решение, мы были бы очень признательны, если бы вы могли дать несколько советов относительно того, как отлаживать программу сборки, встроенную с помощью C (я использовал отладчик GDB, но он просто указывает на строку C программа, в которой происходит ошибка сегментации, вместо строки в программе сборки).

Пошаговое выполнение кода сборки: stackoverflow.com/questions/2420813/   —  person Adam Lee    schedule 13.11.2020

movl %ebp, %esp в синтаксисе AT&T перемещает значение из ebp в регистр esp. Вы хотите обратного.   —  person Adam Lee    schedule 13.11.2020

Просто для проверки — вы уверены, что правильно компилируете и собираете всю программу как 32-битный код? В 64-битной системе это обычно означает использование -m32 при компиляции и компоновке.   —  person Adam Lee    schedule 14.11.2020

@NateEldredge Да, я компилирую программу как 32-битный код.   —  person Adam Lee    schedule 14.11.2020

Источник: ledsshop.ru

Стиль жизни - Здоровье!