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

时间:2018-04-01 06:41:26

标签: assembly nasm x86-64

我正在使用协处理器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

1 个答案:

答案 0 :(得分:1)

x87为堆栈下溢生成浮点异常#IS,但可以屏蔽此异常。此外,在下一个x87指令之前不会生成异常,并且在程序中没有异常。

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

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