The problem is that in your deployed/run-time byte code the jump destinations are wrong. I don't think the assembler is expecting to find a constructor in there, and so it doesn't account for the 13 byte shift in the jump destinations.
This is the run-time dissasembly. You can see that the jumps are 0xd off.
0000 PUSH1 0x24
0005 PUSH1 0x16 <-- should be 0x09
000a PUSH1 0x84
000f PUSH1 0x20 <-- should be 0x13
If you want to explore this kind of thing, I recommend LLL. The LLL compiler is available when you build Solidity from source. The LLL equivalent of your contract is as follows:
(when (lt (calldatasize) 0x24) (stop))
(when (lt (calldatasize) 0x84) (stop))
returnlll expression above is a macro that takes into account the constructor/deployment code when invoking the compiler, so this problem does not occur.
You can find LLL documentation here.