What you describe is correct and the way all C compilers work. The variable foo is a 16 bit variable that the compiler can place anywhere. It's value is 0x0012 and it goes in two 8 bit locations, hence db 0x12,0x00. Had you typed int foo = 0x1234 then it would be db 0x34,0x12.
I've not used the sdcc compiler (I will have a look soon) but assume it sticks to the convention of normal C (CONSTANTS = uppercase, variables = lowercase). So, BD0STAT is a constant and has the value 0x200 and the variable bd0stat is located at that address. So var=bd0stat should return the contents of location 0x200. However, C18 doesn't stick to this convention and so I could be wrong.
Mike.