Uploading code to mega or uno sourced from AVR assembler

Hello, I am new to Arduino but I'm NOT new to ATmega devices. I'm writing an application for the ATmega128 but at this stage I'm using an ATmega2560 as it comes with the Atmel STK600 development kit. The application uses two async data streams at 9600bps & I've written code to monitor either stream using the 'spare' two usarts on the 2560. One usart reads everything from the selected data stream while the other reformats it and presents it as a hex dump for debugging purposes. This output stream is fed at 38400bps into an Arduino serial-to-USB converter, which is viewed on a PC via the Arduino serial monitor screen. All well and good.
When I switch my hardware to an ATmega128, I will lose the two spare usarts and so I want to set up a freestanding monitoring unit with a USB interface into the Arduino serial monitor.

The first question is, can you load code into an Arduino Mega which was produced by the Atmel AVR assembler? (meaning via the presumed SPI facility that must exist behind the USB port on the Mega).

I'm fairly confident that the Mega will be able to push the 'output' data stream from my monitor code into the usart behind the USB port and have it come out in the serial monitor. I'm also fairly confident that I could set up a JTAG header on a prototyping shield and program the Mega that way.
I would appreciate an insight into how Arduino actually uploads its code.

Second question: The Uno is based on the ATmega328 which only has one true usart. I believe the USB port is attached to the SPI facility. Is the USB port capable of doing any kind of output into the Arduino serial monitor?

This is a question - NOT a tutorial !

The Atmega 328 UART pins are quite separate from the SPI and ICSP pins. You can upload a program using the ICSP pins and if there is a bootloader installed you can upload a program using the Tx and Rx pins.

AFAIK it is the same on the Atmega 2560.

...R

The USB port on Arduino Uno and mega is attached to usart0.

The Arduino IDE uses avrdude to upload programs via the bootloader, but it doesn’t have support for .hex files, so if you have a .hex from, say, the Atmel assembler, you will need to use avrdude directly from the command line. The Uno uses “programmer” type “Arduino”, and the mega uses stk500v2.

Thanks for the answers. I can see now from the Uno doco that the Uno won't do my job & I'll need the Mega instead.
I have found avrdude so I'll read the help and see what I can make of it.