By default, stdin is line-buffered, which means your application doesn't see the data until the user presses ENTER. What you want is an unbuffered stdin so that getchar() receives the keypress immediately.
Fortunately, it's not too hard. Warning, though, I tested this code on Linux, but I don't know if it works on "other" operating systems.
BTW, it is the turning off of canonical mode (~ICANON) that does the trick. My sample code also turns off character echoing (~ECHO) so that the keystroke is not echoed to the screen when you type it. Makes it easier to see that the code does what you need.
On Windows, you can take advantage of the conio library.
The code jsmith gave was for Linux, BSD and others, where termios is available.
This is an platform-specific question because different platforms do things with hardware differently. For example, Windows reads and writes things differently from Linux. In addition, Windows barely allows Assembly code to interface with hardware these days (something that continues to anger me when I want to learn about the low-level things like I could with MS-DOS :P).