If I type out "layout src", it says "No Source Available"
You can always use layout reg to show registers + disassembly. Then you don't need to care about your assembler + linker including line numbers, just symbols for your labels. (Symbols help GDB know where to start disassembly from when you're stopped at an instruction that isn't the first after a label. x86 machine code can't unambiguously be decoded backwards).
The only reason you'd want source lines is to see your comments, but usually you have your editor in another window and for a small loop or block you know what you expect to happen. The comments are to let you get that picture into your head more quickly when you've been away from the code for a while, not so much when you've just written it / are still working on it. But if you do want a reminder on what's supposed to be in which register at a certain point, you can just flip to the source in your editor.
Disassembly is often more useful than the source. And it rules out classes of bugs like a macro definition that didn't work the way you thought, or a typo that becomes obvious once assembled + disassembled.
Use si and ni to single-step by instructions, not source lines.
b *0x1234 sets a breakpoint at a numeric address (which you can copy/paste from the disassembly), or just single-step to where you want a breakpoint and use b there.
See also the bottom of the x86 tag wiki for more tips on debugging asm. Especially using strace for any code that makes system calls.
as max.s -g -o max.o && ld max.o -g -o max
You can do that with one command: gcc -nostdlib -static -g max.s -o max. You might or might not find that easier. But if you have something that can assemble as 32 or 64-bit, being able to add one -m32 instead of adding different options for as and ld is handy. Or if you want to recall the same command and use it on a different source file, max.s only appears once. The biggest advantage is if you want to write a C test harness for your asm function, gcc -no-pie -fno-pie foo.c foo.S Just Works.
(I personally usually leave out the -o max part and just debug gdb ./a.out. But it's possible to get mixed up about which source your a.out came from that way.)
gdb max. You want to run the executable.