我正在使用协处理器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
答案 0 :(得分:1)
x87为堆栈下溢生成浮点异常#IS,但可以屏蔽此异常。此外,在下一个x87指令之前不会生成异常,并且在程序中没有异常。
如果屏蔽了异常,x87会在目标中存储“不确定值”。如果未屏蔽异常,则不存储任何内容。
浮点不定值是一个QNAN,分数中的所有位都设置为0(除了最重要的分数位为1,使其成为QNAN而不是SNAN)。