Also how would I go about doing IO in assembler? For example, let's say I want to put 0x00 on port E. AVR seems to have a convenient OUT instruction which ARM cortex M4 doesn't. Couldn't I just MOV 0x00 into the output data register of port E? the output data register of port E on my MCU is 0x40021014 but I have no idea where to go from there.
EDIT: ok I figured it out. Turns out all my values have to be in registers and I actually use LDR and STR. I don't understand why I can't replace R3 in the STR line with 0x0. Code for future reference:
asm("ldr R1, =0x40021000");//pointer to GPIOE base
asm("ldr R3, =0x00000000");//to set all bits low
asm("str R3, [R1, #0x14]");//store R3(0x00) into R1(GPIOE_base) + 0x14(ODR)
I don't think it will be much faster than doing it in C though.