Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
This is a well-known problem with QEMU. When you use cli; hlt, the QEMU display freezes and is not updated anymore, and even things you wrote to the screen just before are not being shown. Try an endless loop instead of the cli; hlt.
You are making a huge number of mistakes. For instance, you don't set the stack before calling C code, you don't provide enough flags to gcc to tell it is building freestanding, you are not using a cross-compiler, you are casting to char* when you meant unsignd char*, and more.