My suggestion is to read the DOS version of "Art of Assembly Language Programming" by Randall Hyde (which also has a lot you need to know about the IBM PC architecture as well as assembly), and decide on an assembler (one that doesn't run on just DOS- I wouldn't use DOS as a programming bench right now) and stick with it. There are too many x86 assemblers to count, and I daresay NONE of them are fully compatible with one another- it's extremely frustrating.
Most assemblers (especially DOS) accept assembly source in a syntax known as Intel syntax (the other syntax being AT&T- which is a pain and completely opposite to Intel syntax- SRC then DEST vs. DEST then SRC, for example). Intel syntax can further be classified into having support for Microsoft's Macro Assembler features/syntax (MASM) (supports Intel memory models, ASSUME directive, '@' for address-of operator, etc), support for Netwide Assembler features/syntax (NASM) (no memory models, no ASSUME directive, '%' for address-of operator, etc), and small COM-only or "basic" assemblers (probably it's own syntax). The only modern assembler I can think of using AT&T syntax is the GNU Assembler; I don't know anyone who uses it for 386 and above code.
I have found so much legacy/modern code examples in MASM syntax that I can't currently justify learning all the differences of NASM. Maybe a good project to do is to create a "NASM2MASM" parser and vice versa (it would also brush up on my FSM skills lol).
The following is a list of assemblers that I have used/tried in the past, along with some quick comments.
A86- Older assembler which runs on Windows. I don't know which features it supports, b/c I didn't know how to use the command line well back then
.
FASM- Flat assembler. Closer to NASM in principle, but incompatible syntaxes? I don't remember.
GAS- GNU assembler. AT&T syntax. That. is. all!
HLA- High Level assembler. Randall Hyde's x86 assembler. Used throughout non-DOS versions of Art of Assembly. Supports numerous features/high-level constructs, but not compatible with MASM, to my knowledge.
MASM- Widely used compiler supporting various macros and features (one could write a book on them- in fact people have!). Modern versions (comes with visual studio) only meant for Windows exes. I haven't tried older versions, and never had much luck with the related MASM32 project.
NASM- Gets rid of all the confusing features of MASM- a "What You Code is What You Mean" Assembler- does not make assumptions about the location of code/data that MASM does (and therefore the Intel memory models are not required). Easier to make a flat binary.
TASM- Dos-only assembler which competed directly with DOS versions of MASM. Run in DOSBOX or a VM. Works fine, just not a fan of using a VM as a programming environment.
WASM (Watcom)- Modern Assembler which supports some variant of MASM syntax and features, but not all. Runs on Windows/Linux, compiles for DOS, windows, etc depending on linker settings. Supposedly, JWASM has better MASM support.
WASM (Wolfware)- Old assembler that occassionally I find modern code for. DOS Only. Supports a macro to invoke dos interrupts directly, making porting a possible pain.
YASM- NASM rewrite/compatible assembler with AT&T syntax support. Joy!
I personally use WASM (Watcom) currently, because of it's versatility in host platform and target, as well as sufficient MASM compatibility (most corrections to legacy code become obvious).
So yes, there are A LOT of x86 assemblers lol. Don't go through the same struggle I did lmao!