Sure, it's called the C calling convention, and all the libc functions work like that. It's more usual to "add esp, " than multiple "pop"s to clean up the stack, but either should work.
You must be used to "stdcall" convention, in which callee cleans up stack... (ends with "ret ")... such as the Windows API. (but "wsprintf" is C call - having a variable number of parameters, it has to be - there may be others)
In both C and stdcall, functions are required to "preserve" (put 'em back like you found 'em) - ebx, esi, edi, ebp (and of course esp). Functions are allowed to trash ecx, and edx (if it isn't used for return). Return value is in eax, normally.
If you're interacting with code that uses either of these conventions, you'd better learn and adhere to them!
Not a concern for Nasm, since we don't do 64-bits, but the 64-bit BSD (and maybe others?) use a *completely* different interface!
Best,
Frank