You said "small microcontroller and had no interfacing, no computer, no debugger, compiler, or assembler.". Well you can get by without the computer, debugger, compiler, or assembler, but you have to have some sort of interface to connect with the microcontroller in order to load the program.
First of all, forget about any high level languages like C. Then the easiest way is to write your program in assembly language, but don't use the assembler to translate it to machine code. Instead, look up each of the assembly instructions in the programming manual, find their equivalent hex coding, and write that down.
You will have to allocate your own variables, so you can fill in the appropriate addresses in the operand portion of the instructions. Also forget about using the stack and heap, too much work. When done, you'll have a machine program that can be loaded directly into the flash memory of the microcontroller -- no linker needed either.
Because of the lack of external address and data busses on almost all microcontrollers (since they would take up too many pins which are needed by I/O ports and peripherals), virtually all microcontrollers are programmed via a special interface like this:
Normally the "programmer" on the left would be connected to a PC, which would download a machine file generated by a compiler/linker.
However if the programmer has a keyboard, like the one below:
then one can enter the hex codes for a manually generated program right into the programmer, and program the device without needing a compiler, linker, or PC which was what you were inquiring about. (The keyboard is also used for editing hex files, and generating checksums.)
Granted very few programmers have keyboards like this. This one would not be suitable for a hobbyist as it probably costs a couple thousand dollars.
This particular programmer programs parts before they are put onto a board; interfaces and sockets are available for several PICs and also Atmel AVRs among others.