gdb offers a target called sim. I have just played a little bit with it
and can not tell much. The sim-target can be used of simulate an ARM
core (ARM7TDMI IRC) and also offers "hooks" for the standard SWI
semihosting stdio. There is no support for integrated functions (like
PLL, UART, SPI etc.).
You may also try QEMU: http://wiki.qemu.org/Main_Page . It's usually
used to simulator "big" controllers but the documentation also mentions
controllers with Cortex-M3 core.
For the first steps you may use the evaluation version of Keil/ARM
MDK-ARM, it can be used to simulate different controllers and the
integrated peripherals. It's a very good simulator for "low-level" work.
Since machine-code generated with GNU tools can be simulated by the
MDK-ARM simulator too you can use the toolchain as in Yagarto for
compilation, assembling and linking.
Hope this gives at least a few keywords to feed a search-engine.