title: push / pop eax gives me "illegal instruction" at compile time
body: <p>I'm just starting with fasm / x86 programming and i started with the 64 bit samples as my target for my project in which i will need some assembly is 64 bit xeons.</p>
  
  <p>I started from the PE64DEMO and modified it to add a loop, however it fails after the first iteration as (from what i could gather online) the Windows api functions can change registers and not restore them. I also read i'm supposed to save what i need myself pushing and poping from the stack, i commented the push and pop, if i uncomment them i get a compile time error stating "Error : illegal instruction pop eax".</p>
  
  <p>Whole file code bellow : </p>
  
  <pre><code>; Example of 64-bit PE program
  
  format PE64 GUI
  include 'win64a.inc'
  entry start
  
  
  section '.text' code readable executable
  
    start:
      sub     rsp,8*5         ; reserve stack for API use and make stack dqword aligned
  
  
  
      ; Assembly code representing expr1 here (for instance mov [count], 0)
      mov eax,10
      .for_loop_check:
      ; Assembly code representing expr2 that jumps to .exit_for_loop when false (for instance cmp [count], TOP_VALUE / jae .exit_for_loop when expr2 is "count &lt; TOP_VALUE"). Note that if expr2 is absent then so is the jump.
  
      cmp eax,0
      jz .exit_for_loop
  
      ;push eax
  
      ; body code here
      mov     r9d,0
      lea     r8,[_caption]
      lea     rdx,[_message]
      mov     rcx,0
      call    [MessageBoxA]
  
      ;pop eax
  
      ; Assembly code representing expr3 here (for instance inc [count])
      dec eax
      jmp .for_loop_check
  
      .exit_for_loop:
  
      mov     ecx,eax
      call    [ExitProcess]
  
  section '.data' data readable writeable
  
    _caption db 'Win64 assembly program',0
    _message db 'Hello World!',0
  
  section '.idata' import data readable writeable
  
     library kernel32,'KERNEL32.DLL',\
        user32,'USER32.DLL'
  
    include 'api\kernel32.inc'
    include 'api\user32.inc'
  </code></pre>