在MIPS中,命令行参数如何准确地存储在$a1中?

在MIPS中,命令行参数如何准确地存储在$a1中?,mips,Mips,考虑以下代码,它读取第一个命令行参数,然后打印它: lw $a0, 0($a1) li $v0, 4 syscall 这是有意义的,因为参数总是存储在与单词对齐的$a1偏移量中。但是,假设第一个程序参数为“jklfjdsaklfjdsklfjsdklfjsklfjsdaklfjlsdkjfjfkjfksalfjsadlkf”。这个巨大的字符串不可能放入0($a1)和4($a1)之间的四个字节中。但代码仍然运行并打印字符串。为什么? 另外,如何将整个字符串放入$a0?因为它不应该真的合适 cha

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

lw $a0, 0($a1)
li $v0, 4
syscall
这是有意义的,因为参数总是存储在与单词对齐的$a1偏移量中。但是,假设第一个程序参数为“jklfjdsaklfjdsklfjsdklfjsklfjsdaklfjlsdkjfjfkjfksalfjsadlkf”。这个巨大的字符串不可能放入0($a1)和4($a1)之间的四个字节中。但代码仍然运行并打印字符串。为什么?

另外,如何将整个字符串放入$a0?因为它不应该真的合适

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

00000000:
0:8082000b英镑$2,11($4)
4:03e00008 jr$31
8:00000000无
0000000c:
c:8c820004 lw$2,4($4)
10:00000000无
14:80420001磅$2,1($2)
18:03e00008 jr$31
1c:00000000无
手臂

00000000:
0:e5d0000b ldrb r0[r0,#11]
4:E12FF1E bx lr
00000008 :
8:E590304 ldr r3[r0,#4]
c:e5d30001 ldrb r0,[r3,#1]
10:E12FF1E bx lr
x86

0000000000000000:
0:0f b6 47 0b movzbl 0xb(%rdi),%eax
4:c3 retq
5:90不
6:66 2e 0f 1f 84 00 00 nopw%cs:0x0(%rax,%rax,1)
d:00
0000000000000010 :
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是一个地址,编译器会传递该地址。如果您在不同的级别工作,那么操作系统/环境将定义命令行字符串是以这种方式传递的,这将包括“为什么”问题。你没有提供足够的信息来回答这个问题


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

它作为地址传递给字符串,而不是字符串itself@old_timer哦,这很有道理。所以你是说mips会自动将命令行参数放入一些内存地址,然后将这些内存地址放入0($a1)、4($a1)等等?与mips无关。编译器一般都会这样做。即使对于使用堆栈的架构,它通常也是字符串的地址。如果您在main()中讨论arvg参数,请看这是指针/地址定义,这意味着发送地址而不是整个字符串。
00000000 <fun0>:
   0:   8082000b    lb  $2,11($4)
   4:   03e00008    jr  $31
   8:   00000000    nop

0000000c <fun1>:
   c:   8c820004    lw  $2,4($4)
  10:   00000000    nop
  14:   80420001    lb  $2,1($2)
  18:   03e00008    jr  $31
  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
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