I know there are a lot of threads regarding this topic, but I can't find the answer for this precise topic:
First of all, with the "first assembler" I mean the program that translates, let's say, the instruction "mov" to the specific machine code the ALU understands, 1100111 or whatever other binary number. There's some gap between those two steps that I can't find answers for.
I understand the process is something like: you have a cpu chip built with an specific micro architecture that implements N instructions. Each instruction is accessed internally in the ALU with a binary number or opcode (000 mov, 001 add, etc) At some point of history, instructions were loaded into the CPU using punched cards, tapes, etc.
But then, you want to raise the level of abstraction and needs an assembler to program in a higher language instead of opcodes, and this is exactly where I'm missing something.
At this point, I guess some bootstrapping is used to go from opcodes to assembler, but how? How do you write the assembler v0.00 for a given brand new cpu? Is there any chip hardcoding those instructions, maybe the first assembler is hardware based?
In "Assembler and Loaders", it seems the first assembler was created using a ROM, hardlinking telephone selectors to memory addresses.
"One of the first stored program computers was the EDSAC (Electronic Delay Storage Automatic Calculator) developed at Cambridge University in 1949 by Maurice Wilkes and W. Renwick. From its very first days the EDSAC had an assembler, called Initial Orders. It was implemented in a read-only memory formed from a set of rotary telephone selectors, and it accepted symbolic instructions. Each instruction consisted of a one letter mnemonic, a decimal address, and a third field that was a letter. The third field caused one of 12 constants preset by the programmer to be added to the address at assembly time."