我试图在一些操作后返回数字,但编译器返回push esp,push num,pop esp,pop num invalid instruction operands ,尽管MASM allows push . 它's runing on x64, MASM, with Visual Studio (Debug mode x64). What'错了吗?

PUBLIC from_asm
EXTERN puts:PROC
EXTERN exit:PROC

.data
   num dd ?

.code

from_asm PROC

mov EAX, not -30
or EAX,21
mov EBX, not 21
and EAX, EBX
or EAX, 23

mov num, eax
mov esp, dword ptr [num]
push esp
push num
call puts
pop num 
pop esp

ret

from_asm ENDP

END

P.S. 我检查过,所有操作 EAXnum 包含数字31 .