在 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 目标。
考虑以下代码,它读取第一个命令行参数然后打印它:
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 目标。