la, li, and lui Instructions


The following gives three load immediate instructions.
la rd, mem         # load address
Loads the destination register with the effective address (NOT the contents of the memory location) of the specified data item.

li rd, imm         # load immediate
Loads the destination register with the value of an expression that can be computed at assembly time.

lui rd, imm         # load upper immediate
Loads the most-significant half of a register with the expression’s value. The least-significant half of the register is filled with zeros. Value of the expression must be in the range [0, 65535] = [0, 216-1] = [0, (FFFF)16].
la li lui
       .data
 msg:  .ascii  "Class, "
       .ascii  "Greeting"
       .byte   0

       .text 
       la  $a0, msg+7
       li  $v0, 4
       syscall
   .text 
   li  $a0, -10+2
   li  $v0, 1
   syscall
   .text 
   lui  $a0, 1
   li   $v0, 1
   syscall
Output Output Output










Note that the immediate operand in li and lui is an expression. The expression includes several operators such as * (multiplication), / (division), % (remainder), etc. However, (the instructor believes) the MARS and Spim are not able to handle most expressions, e.g., -10+2 is fine in the above code for Spim, but not for MARS and 10*2 does not work for both simulators.