首页 > 解决方案 > 在 NASM 中的 scanf 之前推入堆栈时发生分段错误

问题描述

下面的代码是使用 scanf 和 printf 读写单个浮点数的汇编代码。

extern scanf
extern printf

section .data
    x   dq  0.0
    fmts    db  "%lf", 0
    fmtp    db  "%lf", 0xA, 0

section .bss

section .text
    global main

main:
push    rbp

    ;push   rax
    ;push   rax
    mov rdi,    fmts ;scanf format
    mov rsi,    x    ;The address of the variable
    call    scanf

    mov rdi,    fmtp ;printf format
    movq    xmm0,   qword[x] ;The value of the variable
    mov rax,    1
    call    printf

Exit:
pop rbp
    mov rax,    1
    mov rbx,    0
    int 0x80

(要编译和运行这段代码,它是最容易使用的gcc:) nasm -f elf64 ./a.asm && gcc -o ./a a.o -no-pie && ./a

此代码工作正常;但是当我们取消注释其中push rax一行时,就会发生分段错误。但是,如果我们取消注释这两push rax行,它将再次正常工作。看来我们要么不应该将任何东西压入堆栈,要么至少 128 位。值得一提的是,压入堆栈的变量的值(在本例中为rax,)将保持不变。

有人可以解释这种行为吗?提前致谢。

标签: assemblyscanfx86-64nasm

解决方案


推荐阅读