8051

LOW() HIGH() to use variable instead of value


I know this is how we use LOW() and HIGH() operators:

MOV P3,#LOW(-10)

But what if -10 is a variable or an input on one of the ports? This is what I need:

MOV P3,#LOW(P0)

Which does not work. The Edsim51 simulator says that a label is expected. But I don't think how I can use a label here, maybe it means a function label, I tried that, but as far as I know, we cannot return a value from a function, so I still don't know how to use a function label here.

MOV P3,#LOW(func)
func:
RET P0

Which is incorrect.

This is the only thing I could find on the internet, just a discussion about this issue: https://community.arm.com/developer/tools-software/tools/f/keil-forum/22073/how-to-use-low-or-high-in-a51

On the official documentations, I can't even find LOW() and HIGH() operators anywhere, which is weird to me: https://www.keil.com/support/man/docs/is51/is51_instructions.htm


Solution

    1. You don't.
    2. It doesn't make sense, how do you take the low byte or the high byte of something that is only one byte wide to begin with?
    3. You're not finding them in the official instruction documentation because they aren't instructions. The CPU never sees them. They're just assembler shortcuts. MOV P3, #LOW(-10) is just another way of writing MOV P3, #246 that makes programmer intent clearer.