Я пишу программу на 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
Источник: