assemblymipssign-extensionzero-extension

Clarifications on signed/unsigned load and store instructions (MIPS)


I can't seem to grasp the concept on these stuff, even with the help of Google and a textbook in my hand.

Following the format (opcode, rs, rt, offset)...


Solution

  • In the case of lb and lbu, what's the difference?

    The "load byte" instructions lb and lbu load a single byte into the right-most byte of a 32-bit register. How do you set the upper 24 bits? The unsigned operation will set them to zero; the signed operation will sign-extend the loaded byte.

    For example, suppose you read the byte 0xFF from memory. lbu will 0-extend this value to 0x000000FF and interpret it as 255, while lb will sign-extend it to 0xFFFFFFFF, which is interpreted as -1.

    Why doesn't lw have an unsigned version? Even the store instructions don't have one...

    The "load word" instruction (lw), on the other hand, loads a 32-bit quantity into a 32-bit register, so there is no ambiguity, and no need to have a special signed version.

    If you are storing less than a full 32-bit word, there is nothing you can do with the extra bits in the register except throw them away (ignore them).

    Does it also follow the MIPS arithmetic definition that 'unsigned' just means it won't report an overflow?

    I think this convention is only for the add and subtract instructions. For the other instructions, signed/unsigned indicates whether sign-extension will be performed.

    Do you sign extend the offset before adding it to the value of the address? Or add before extending?

    If an offset is sign-extended, it only makes sense to do it before adding it to the base address. I think a review of two's complement arithmetic will make this clear.