在 MIPS 中,命令行参数究竟是如何存储在 $a1 中的?

In MIPS, how exactly are command line arguments stored in $a1?

考虑以下代码,它读取第一个命令行参数然后打印它:

lw $a0, 0($a1)
li $v0, 4
syscall

这是有道理的,因为参数总是存储在 $a1 的字对齐偏移量中。但是,假设第一个程序参数是 'jklfjdsaklfjdsklfjsdklfjsklfjsklfjsdaklfjlsdkjfjfksalfjsadlkf'。这个巨大的字符串无法放入 0($a1) 和 4($a1) 之间的四个字节中。然而代码仍然运行并打印字符串。为什么?

另外,如何将整个字符串放入 $a0 中?因为它又不适合。

char fun0 ( char *x )
{
    return(x[11]);
}
char fun1 ( char **x )
{
    return(x[1][1]);
}

mips

00000000 <fun0>:
   0:   8082000b    lb  ,11()
   4:   03e00008    jr  
   8:   00000000    nop

0000000c <fun1>:
   c:   8c820004    lw  ,4()
  10:   00000000    nop
  14:   80420001    lb  ,1()
  18:   03e00008    jr  
  1c:   00000000    nop

手臂

00000000 <fun0>:
   0:   e5d0000b    ldrb    r0, [r0, #11]
   4:   e12fff1e    bx  lr

00000008 <fun1>:
   8:   e5903004    ldr r3, [r0, #4]
   c:   e5d30001    ldrb    r0, [r3, #1]
  10:   e12fff1e    bx  lr

x86

0000000000000000 <fun0>:
   0:   0f b6 47 0b             movzbl 0xb(%rdi),%eax
   4:   c3                      retq   
   5:   90                      nop
   6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
   d:   00 00 00 

0000000000000010 <fun1>:
  10:   48 8b 47 08             mov    0x8(%rdi),%rax
  14:   0f b6 40 01             movzbl 0x1(%rax),%eax
  18:   c3                      retq   

所以当你有 int main ( int argc, char *argv[]) 时,argv 是一个地址,编译器传递该地址。如果您在不同的级别工作,那么操作 system/environment 定义命令行字符串以这种方式传递,这将涵盖 "why" 问题。您没有提供足够的信息来回答问题。

而且它基本上与mips无关,它与一些针对mips的系统的实现有关。相同类型的实现也可以用于非 mips 目标。