I hardly know where to begin!
MrCBofBCinTX identifies what is perhaps the "biggest" problem. It'll "work" with mismatched sizes, but not as (presumably) intended. "mov dword[a], 1" overwrites "tmp1" as well as "a"! You almost certainly want to change all the "resw"s to "resd"s.
The default entrypoint known to ld is "_start", not "start" (yes, you need to use ld - one does not execute an .o file, generally). You can tell ld to use a different entrypoint with the "-e" switch, but it's probably easier to just add the underscore (both the "global" declaration and the label itself).
Your code itself is pretty good, until you get to the "idiv". "idiv" (and "div") are somewhat tricky, since some of the operands are not explicitly stated. In particular, "idiv", with a dword (stated) operand, divides edx:eax (edx * 4G + eax) by... whatever you say. If the result of this division won't fit in eax, it causes an exception, crashing your program. The error message presented is likely to be "division by zero" (dos) or "floating point error" (Linux) - not very helpful, since we didn't do either! The way to fix this is to put a "cdq" (convert dword to qword - works with eax and edx, again "unstated") immediately before the "idiv".
When you get to the end, there's a "trick" you can use... Since you don't (yet) have a way to display the result, you can make it the exit code - instead of "mov ebx, 0" do "mov ebx, [a]". Then you can see it with "echo $?" - immediately after running your program... when you get it to run
Now assemble it with "nasm -f elf32 myprog.asm", as you've apparently done, and link the object file into an executable with "ld -o myprog myprog.o". Then you should be able to run it, and see the result with "echo $?". The exit code is only good for a byte, but it should work for the small values you're currently using.
If you really, really don't want to use ld, there's a way around that which we can show you, but it's easier(?) and more flexible(!) to let ld do its intended job.
Best,
Frank