Well in that case, I'd download Rob Brown's SDK2x, which works really nice in uboot as that's what it was designed for.
Unfortunately, there are currently only two ways of running non-OS code on a retail system:
1) [Safest, Slowest] Use a trampoline. Rob has one in his SDK. This is basically a Linux application that kills the OS by resetting the processor, and then takes over after initialisation. The downside to this is the 20+ seconds to wait for the OS to bootup every time you want to try your code.
2) [More dangerous, but faster] Upload code via serial lead and let uboot execute it for you. Much quicker turn around, and no sd card required. Downside being that on a retail system, you have trash the linux kernel at least once (ie. flash a known bad kernel to force a crc failure), otherwise it'll pass control to the kernel and you don't get a look in. Once you've done it once however, you can add a small delay before it looks for the kernel - so you can put the good kernel back after the patch is done.
Oh, and from your post you say the ARM doesn't have a stack. Well, it doesn't have a hardware stack, sure, but then again it doesn't need one. Just reserve a small amount of ram somewhere, and you can use any register you want as a stack pointer. R13 is the preferred register however. Look at the LDM/STM instructions.