MIPS 汇编程序如何获取立即数(常数)值?

How MIPS assembler acquires immediate (CONSTANT) values?

我在任何地方都找不到类似的问题。 例如,当我们想在内存中添加一个预定义的值时,我们会获取其地址并复制其内容,但如果我们想将 40000 添加到寄存器中,汇编程序将如何解释 40000 并复制其值。 谢谢你帮助我理解这个概念

该值直接编码到指令字中。

例如,指令ADDI rs,rt,immediate的编码如下:

         001000   rs   rt  immediate
#bits:     6       5    5      16

因此立即数常量将放在指令字的16 个最低有效位中。请注意,立即数是符号扩展的,因此它只能对 -32768..+32767 范围内的值进行编码。所以你不能用一条指令将 40000 添加到一个寄存器,除非你已经在某个寄存器中恰好有值 40000。

有关详细信息,请参阅文档 面向程序员的 MIPS32™ 架构 第二卷:MIPS32™ 指令集.

unsigned int fun0 ( void )
{
    return 40000;
}
unsigned int fun1 ( void )
{
    return 0x40000;
}
unsigned int fun2 ( void )
{
    return 0x12345678;
}
unsigned int fun3 ( void )
{
    return 0x12340000;
}
unsigned int fun4 ( void )
{
    return 0x00005678;
}

Disassembly of section .text:

00000000 <fun0>:
   0:   03e00008    jr  
   4:   34029c40    li  ,0x9c40 ; 0x34xxxxxx ORI ,[=10=],0x9c40

00000008 <fun1>:
   8:   03e00008    jr  
   c:   3c020004    lui ,0x4

00000010 <fun2>:
  10:   3c021234    lui ,0x1234
  14:   03e00008    jr  
  18:   24425678    addiu   ,,22136

0000001c <fun3>:
  1c:   03e00008    jr  
  20:   3c021234    lui ,0x1234

00000024 <fun4>:
  24:   03e00008    jr  
  28:   24025678    li  ,22136  ; 0x24xxxxxx  ADDIU ,[=10=],0x5678


unsigned int fun5 ( void )
{
    return 0x9999;
}
00000000 <fun5>:
   0:   03e00008    jr  
   4:   34029999    li  ,0x9999  ; 0x34xxxxxx  ORI ,[=10=],0x9999

li是伪指令