The MacroAssembler AS
I use The Macroassembler AS. It's modern, multiplatform (Unix, Windows, DOS) with macros and all that other good stuff, still supported and under development, and supports an amazing variety of CPUs (around 60), including modern MCUs such as Amtel AVR. It's very nice to be able to use the same assembler for all one's 8- and 16-bit development.
Output is to its own record-based format,
.p files. Tools are provided to generate binary and hex record files from those, but I found the format simple enough that I just wrote a bit of Python code to handle conversion for my various needs, which included loading code into an emulator/unit test framework and generating Apple II binary files with a check for overlapping records. (You can find the code in my 8bitdev repo.)
Though it doesn't have a public development repo, I help maintain
KubaO/asl on GitHub where we import every release on to the
upstream branch. You can easily fetch this if you want to build it yourself and perhaps hack on it. There's also some fetch and build support under the
tool/ directory in my 8bitdev repo above, since the build/test script there automatically downloads and builds the tools it needs.
ASxxxx Cross Assemblers
I've also tried out the ASxxxx assembler suite, which generates relocatable binary files and has a linker, but I found in the end that for multiplatform work it's easier just to re-assemble than deal with linking (often different assembly parameters are needed for different platforms), and on modern hardware assemblers are so blazingly fast that there's no difference in build time. I also found the slightly odd syntax mildly annoying.