It's a 32-bit code.
push message
call printf
add esp,4
is a 32-bit CDECL or C calling convention. For 64-bit code, it is different entirely. Using "push" indicates it is a 32-bit code. And should not be compiled with "-f win64" switch. And for that, choosing the right linking switches is crucial.
extern printf
extern scanf
section .data
prmpt1: db 'Enter an integer: ',0
prmpt2: db 'Your integer is %lld',0ah,0
format: db '%lld',0
value: dq 0
section .text
global main
main:
sub rsp,40 ;stack alignment + shadow space
mov rcx,prmpt1
call printf
mov rdx,value
mov rcx,format
call scanf
mov rdx,qword[value]
mov rcx,prmpt2
call printf
add rsp,40
ret
; nasm -f win64 myprog.asm
; gcc -m64 myprog.obj -s -o myprog.exe
At this point, I am not sure what exactly you want. The whole picture you're trying to give me is that you're using 32-bit code and 32-bit calling convention, compiled into 64-bit binary format (which is PE32+ instead of PE), using 32-bit linking switch.. Is that what you're trying to do? You need to make up your mind.
EDIT: Added full 64-bit code and put them in a code tag