Вопросы

Ошибка сегментации при вызове функции сборки 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 программа, в которой происходит ошибка сегментации, вместо строки в программе сборки).

Читать:
Не удается подключиться к базе данных MySQL из Monodevelop в Linux Mint

Пошаговое выполнение кода сборки: 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

Похожие записи

На 33% меньше инструкций, на 17% меньше доступа к памяти, но в 4 раза быстрее?

admin

GitHub Fork или переименовать или создать новый git?

admin

Как получить атрибуты сюжета в Plots.jl

admin

Как создать конвейер шаблона потока данных с помощью Beam 2.0?

admin

Почему эта ошибка? Подключиться к sts.amazonaws.com:443 [sts.amazonaws.com/54.239.29.25] не удалось: время ожидания подключения истекло: com.amazonaws.SdkClientException

admin

VSCode + Pytest: ошибка: TypeError: невозможно прочитать свойство $ неопределенного значения

admin