Ошибка сегментации в сборке x86 - PullRequest
1 голос
/ 17 января 2020

При выполнении следующего кода в синтаксисе at & t я получаю ошибку сегментации, хотя она должна была напечатать 3. Я попытался вернуться до вызова bar, и он работает, как и ожидалось. Я думаю, что после вызова bar значение esp меняется.

Я пытался написать следующий код C на языке ассемблера: -

int foo () {  
    int a, b, c, d, e, f;  
    a = 0, b = 1, c = 2, d = 3;e = 5, f = 6;  
    bar(b, c, d, f);
    return a + b + c;
}
int bar(int a, int b, int c, int d) {
    int x, y, z, w;x = a, y = b, z = c, w = d;
    return x + y + z + w;
}

Makefile

default:
    rm -f assembly.o code.o
    as -32 assembly.s -o assembly.o
    gcc -m32 -c code.c -o code.o
    gcc -m32 code.o assembly.o -o prog
    ./prog

сборка.s

.global foo
foo:
    subl $24, %esp          

    movl $0, 20(%esp)       
    movl $1, 16(%esp)       
    movl $2, 12(%esp)       
    movl $3, 8(%esp)
    movl $5, 4(%esp)
    movl $6, (%esp)

    subl $16, %esp

    movl 16(%esp), %eax
    movl %eax, 12(%esp) 

    movl 24(%esp), %eax
    movl %eax, 8(%esp)

    movl 28(%esp), %eax 
    movl %eax, 4(%esp)

    movl 32(%esp), %eax 
    movl %eax, (%esp)

    call bar
    add $16, %esp

    movl (%esp), %edi
    movl 4(%esp), %esi
    movl 8(%esp), %edx
    movl 12(%esp), %ecx
    movl 16(%esp), %ebx
    movl 20(%esp), %eax

    addl %ebx, %eax
    addl %ecx, %eax

    add $24, %esp
    ret


bar:
    movl 4(%esp), %eax
    movl 8(%esp), %ebx
    movl 12(%esp), %ecx
    movl 16(%esp), %edx
    add %ebx, %eax
    add %ecx, %eax
    add %edx, %eax
    ret

код. c

#include<stdio.h>
extern int foo();

int main(){
    int a  = foo();
    printf("%d\n", a);
    return 0;
}
...