How did these earlier programmers know what combinations of binary produced certain results? Is there a way I can create an assembler from binary today?
Every microprocessor has an instruction set. Each instruction corresponds to a specific binary code. You can find out which binary code corresponds to which processor instruction by reading the specification sheet for the microprocessor.
From there, it's simply a matter of specifying the binary codes in the right order to produce the desired result.
Robert Harvey is correct.
However, you can create an assembly language at the same time you write an assembler. It's a cyclical process, where you add code to the assembler to process your assembly language into operation codes, or opcodes.
Ideally, each assembly language instruction is represented by an opcode. Sometimes, one assembly instruction requires many opcodes.
You also need a linker, to link assembly object modules together into an executable program. Back when assembly was the only language choice, the linker was a separate program, run after your code was assembled.