繁体   English   中英

x86组装分段错误

[英]x86 Assembly segmentation fault

我可以编译它,但是当我运行它时会出现“分段错误”。
如果有人解释为什么会很乐意。

.section .data
digitformatstr: 
.string "%d\n"

.section .text
.global main

main:
    push    $1337
    pop     %eax
    movl    %eax, -4(%ebp)
    push    -4(%ebp)
    push    $digitformatstr
    call    printf
    addl    $8, %esp

您似乎正在使用GNU汇编器和GCC的C库来构建可执行文件。 您的代码的主要问题是您在使用它之前未设置寄存器%ebp 通常,使用C您的函数首先会设置本地堆栈帧,其中包括初始化%ebp 要正确设置本地堆栈框架,并在返回之前清理堆栈,可以使用如下代码:

.section .data
digitformatstr:
.string "%d\n"

.section .text
.global main

main:
    push    %ebp           /* setup local stack frame */
    mov     %esp, %ebp

    push    $1337
    pop     %eax
    movl    %eax, -4(%ebp)
    push    -4(%ebp)
    push    $digitformatstr
    call    printf
    addl    $8, %esp

    leave                  /* remove local stack frame */
    ret

可以在此处找到有关堆栈框架和32位C调用约定的初学者指南。

关于您的代码的另一条评论。 你做:

    push    $1337
    pop     %eax
    movl    %eax, -4(%ebp)
    push    -4(%ebp)
    push    $digitformatstr
    call    printf

我不确定您要使用此代码做什么。 似乎您试图将1337作为局部变量放置在堆栈上(但尚未在堆栈上为局部变量分配空间)。 由于它似乎是您试图简单地在第二个参数是整数的情况下调用printf ,因此您应该将该值(1337)压入堆栈。 上面的所有代码应该简单地是:

    push    $1337               /* 2nd argument to printf */
    push    $digitformatstr     /* 1st argument to printf */
    call    printf              /* call printf

main的最终清理代码可能类似于:

main:
    push    %ebp            /* setup local stack frame */
    mov     %esp, %ebp

    push    $1337           /* 2nd argument to printf */
    push    $digitformatstr /* 1st argument to printf */
    call    printf          /* call printf
    addl    $8, %esp        /* cleanup the 2 32 bit arguments */
                            /* we pushed on the stack */

    leave                   /* remove local stack frame */
    ret

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM