Actually I switch between the two to differentiate between functions and variables, with constants in uppercase underscored.
So you get things like (C examples, in ASM I use the same scheme):
SomeFunction()
Some_Variable
SOME_CONSTANT
The only thing that doesn't follow that scheme are loop counters, which are always lowercase and a single letter.
I'm not sure it really matters which scheme you choose to use, just so long as you use it consistently throughout your code. I'd like to think mine makes my code more legible, but it's difficult to quantify something like legibility when you're the one writing the code.
I use both. PrefixVerbNoun() for public functions, prefix_lower_case for public module variables, and lower_case for local variables and struct field names.
I prefer the UpperCase format for function names. For variable names, I usually use initial lower case and then upper case for the first letter of all other words, as in thisIsAVariableName. Except I also generally use Hungarian notation, so the actual name of the variable is in UpperCase format, but the type abbreviation is all lowercase, as in:
unsigned long ulSomeVariable;
I only use underscores for constants, because I type them in all uppercase (like THIS_IS_A_CONSTANT), and for scope specification (as in g_ for a global variable).
in my opinion it is more important to give the functions and variables MEANINGFUL names to keep the need to comments minimal.
I also think it is important to give the code some structure and to avoid possibly GENIOUS pointer constructs which no pig can understand a week later: writing easy readable code with clear layout is more important than any geniousness which makes the whole stuff looking scanny and weird.