Te estas olvidando que al hacer un call se guarda en el stack automáticamente la dirección de retorno del llamador. Por lo tanto el pop ax que ejecutas al comienzo de tu rutina lo que quita del stack es la dirección de retorno y no el parámetro.
Por otro lado la combinacion push ax + ret , con ax conteniendo cualquier otra cosa que no sea una dirección de retorno va a hacer que el programa falle porque el ret quita del stack la dirección de retorno y salta a esa dirección.
Saludos,
Gustavo