Hmm, I don't really see what's going on. Perhaps when setting your speed to 0 (as I said in my previous post) also set x to xprevious and y to yprevious (that will move it back to the previous step, where it was still on-screen). You'll need blocks:
...(like before)...
set speed to 0
set x to "xprevious" and y to "yprevious"

I'm not sure it's that complex. I think I know why, but not sure how to fix it. It is the type of event that is the problem. If I move the object_dragon to the top and then let off the key (arrow up), then press up again, it will not go up. But, if I hold the key press, the arrow up, and do not let off of it, no depress, it will continue past the top, or zero, 0. The reason I believe is because the iteration of movement only tests for the first keypress. So, if I start at the bottom and press the up key it only asks once, Are you at 0 yet? No, okay, move up. And that's the last time it asks until I release the up arrow key. If I stop press the up arrow at 0, and then press it again, I will not move up and stay on the screen because the event was triggered again and the if statement was executed. In other words, each movement up does not really cause the entire event to fire. I'm not sure if that is counterintuitive or not, so I'll wait until I learn the program some more. But, the assumption was that every single movement up the screen would also cause both actions within the event to occur. That is not true.