即使堆栈为空,值也会弹出并存储在变量中

Value getting popped and stored in a variable even when stack is empty

我正在使用协处理器 80387 计算数据段中某个给定数字的平均值,并且可能从堆栈帧中弹出所有内容。 最后,我试图从空堆栈中弹出一个值到一个名为 "pot" 的变量中,然后使用 printf 打印该变量。 通过,为什么即使堆栈为空,值也会在 "pot" 中弹出?

这是代码:

%macro print 2
    mov rax,1
    mov rdi,1
    mov rsi,%1
    mov rdx,%2
    syscall     
%endmacro

%macro exit 0
    mov rax,60
    mov rdi,0
    syscall
%endmacro

extern printf
extern scanf


section .bss
    sum resq 1
    variance resq 2
    mean resq 1
    std_dev resq 1

    temp resq 1
    showarr resb 16

    pot resb 8
section .data
    menu db 10," "
    lenmenu equ $-menu

    msgvar db 10," : "
    lenvar equ $-msgvar

    msgmean db 10,"Enter the first number : ",10
    len1 equ $-msgmean

    arr dq 1h,1h,1h,1h,1h
    tot dq 5h
    frmt1 db 10,"Total %d elements present ",10,0
    frmt2 db 10,"Mean : %lf ",10,0
    frmt3 db 10,"Variance : %lf",10,0
    frmt4 db 10,"Std_Dev. : %lf",10,0

    frmtp db 10,"top: %ld",10,0
    newline db 0AH

    tt dq 3

section .code
global main
main:
    push rbp
    mov rbp,rsp 

    finit
    fldz
    mov rsi,arr
    mov rcx,[tot]
    back:

        fadd qword[rsi]
        add rsi,8
    loop back

    fst qword[sum]

    mov rax,0;
    mov rdi,frmt1
    mov rsi,qword[tot]
    call printf

    fdiv qword[tot]; 
    fstp qword[mean]

    mov rax,1
    mov rdi,frmt2
    movq xmm0,qword[mean]
    call printf


    fstp qword[pot]

    mov rax,1
    mov rdi,frmtp
    movq xmm0,qword[pot]
    call printf

    mov rsp,rbp
    pop rbp


exit

x87 为堆栈下溢产生浮点异常#IS,但是这个异常可以被屏蔽。此外,直到下一条 x87 指令才会产生异常,而你的程序中没有。

如果异常被屏蔽,x87 会在目标中存储一个“不确定的值”。如果未屏蔽异常,则不会存储任何内容。

浮点不定值是一个 QNAN,小数中的所有位都设置为 0(除了最高有效位为 1,使其成为 QNAN 而不是 SNAN)。