It's a bare metal program so I don't really have anywhere to print to, other than my custom function to output to the uart. I did double check all the address to make sure they agreed with the documentation and the Qemu source code. I tried changing around the destinations of the output just to verify the order of the write or the destination somehow affected the output. I tried being tricky, like instead of writing to usart 3 I wrote to uart 4 - 0x400 (the same address, it didn't work). The code should be simple enough that I don't have room for any crazy mistakes: volatile unsigned char * const USART1_PTR = (unsigned char *)0x40011000; volatile unsigned char * const USART2_PTR = (unsigned char *)0x40004400; volatile unsigned char * const USART3_PTR = (unsigned char *)0x40004800; volatile unsigned char * const UART4_PTR = (unsigned char *)0x40004c00; void display(const char *string, volatile unsigned char * uart_addr){ while(*string != '\0'){ *(uart_addr+4) = *string; string++; } } int my_init(){ display("Test 1/4\n", USART1_PTR); display("Test 2/4\n", USART2_PTR); display("Test 3/4\n", USART3_PTR); display("Test 4/4\n", UART4_PTR); } In the past I ran a really long test where I wrote to every possible address just to see what happens. No unexpected output occurred. I can do that test again, but it takes hours. I could also write code to convert the address to something printable to verify the address isn't being changed, but that seems unlikely. Another thought I had is maybe there is some sort of interaction between where I am setting the stack top - 0x20001000 - but that doesn't seem like it should interfere. Maybe the linker or objcopy are doing something crazy? I don't understand Qemu enough to know what should be calling the functions that handle UART read/write. Is there something I should look at in Qemu and try to intercept? On Fri, Oct 7, 2016 at 6:27 PM, Alistair Francis