I have been playing with an STM32 (also Cortex M3) lately in my spare time and using the CodeSourcery distribution of GCC, which has worked out pretty well.
A colleague who has worked with ARM micros professionally in the past told me that he was satisfied with the IAR toolchain, although I don't know what the cost is like or how the Cortex support is.
There is no need to use a DAC. Voltages are used to represent 1's and 0's by the convention that anything under 0.8V (AKA 'low') is a zero, and anything over 2.4V (AKA 'high') is a one. It's relatively simple to construct circuits that perform logic on these representative voltages.
For example, a circuit can output something in the 2.4V to 5V range to represent '1' if either input is over 2.4V, or something less than 0.8V otherwise, and you have an OR gate. If it requires both inputs representing 1 in order to output 2.4V, you have an AND gate. An inverter just outputs a high when the input is low, and vice-versa. You can build simple gates like these with just a very few transistors, and perform combinatorial boolean logic. By using groups of bits to represent numbers, you can even build circuits to add numbers with combinatorial logic, no software required.
Once you are working with gates, you can construct flip flops, and from them, registers and counters. Flip-flops allow you to store 1's and 0's from one point in time and use them later on. Registers and counters are circuits that perform functions on groups of bits that represent numbers. A register holds a number until you load a new number into it. A counter is like a register, but has another input that causes the stored number to increment. (Decrement is possible too). This puts you in the realm of state machines and sequential logic, still, no software required.
Memory systems are a way to store massive numbers of bits. At a component level, some memory is built like a huge collection of flip-flops, but more commonly there is another technology (DRAM) that, while not exactly a flip flop, does the same thing.
As a further step, you can build a system of sequential and combinatorial logic that can carry out operations depending on the bits stored in a memory system, including writing back new values to that memory system. Now you've arrived at the level of the processor, and everything the processor does, is just hardware carrying out lots of simple tasks. (microprogrammed cores notwithstanding). At this point, the particular combinations of bits that you put in the memory system can be considered machine language software.
Best Answer
The book "A Retargetable C Compiler: Design and Implementation" ( http://en.wikipedia.org/wiki/LCC_%28compiler%29 ) describes a C compiler in all its details. It uses the "literate programming" style, which I found more difficult to read than I expected. But I still recommend it.
Jears ago, before there were any suitable free C compilesr for PICs, I made the Jal language and a compiler for it for the PIC 12/14 bit cores. The source is GPLed (~ 10k lines C, in one file). Nowadays the language and compiler (still GPL, so you can study the source) is maintained by Kyle York ( http://www.casadeyork.com/jalv2/ ).
There is of course the GCC, but it is BIG. There are some master thesis documents that describe the re-targeting to a particular CPU, for instance http://lundqvist.dyndns.org/Publications/thesis95/ThorGCC.pdf , this could serve as a first step into understanding the full GCC internals (which would be a daunting task).
The are various academic textbooks about compiler building, the "dragon" book ( http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools ) being the most famous. But IMO they are almost useless, concentrating on things that were difficult 20 years ago but almost irrelevant now.
You mention "compiler and linker". That shows a mindset that is IMO outdated. For most modern microcontrollers a modern PC can cope with the full application at once, bypassing the compiler/linker split. This makes much better optimization possible.