Я пишу программу на 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
