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是伪指令
我在任何地方都找不到类似的问题。 例如,当我们想在内存中添加一个预定义的值时,我们会获取其地址并复制其内容,但如果我们想将 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是伪指令