首页 > 解决方案 > 程序集 x86 中的分段错误

问题描述

在以 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;
}

生成文件

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;
}

标签: assemblyx86segmentation-faultstack

解决方案


推荐阅读