即使堆栈为空,值也会弹出并存储在变量中
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)。
我正在使用协处理器 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)。