title: ret, retn, retf - how to use them
body: <p>I have the following asm code:</p>
  
  <pre><code>; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
  _wWinMain@16 proc near
  
  var_8= dword ptr -8
  var_4= dword ptr -4
  hInstance= dword ptr  8
  hPrevInstance= dword ptr  0Ch
  lpCmdLine= dword ptr  10h
  nShowCmd= dword ptr  14h
  
  push    ebp
  mov     ebp, esp
  sub     esp, 8
  mov     [ebp+var_4], 5
  mov     eax, [ebp+var_4]
  add     eax, 1
  mov     [ebp+var_8], eax
  xor     eax, eax
  mov     esp, ebp
  pop     ebp
  retn    10h
  </code></pre>
  
  <p>From what I read, you have 3 types of return instruction: ret, retn and retf, meaning return, return near and return far. They allow an optional argument nBytes, that I guess it's the number of bytes to pop, from the defined variables. When should I use retn or retf instead of ret? How can I calculate the optional parameter, nBytes?</p>