考虑以下代码,该代码读取第一个命令行参数,然后输出它:
lw $a0, 0($a1)
li $v0, 4
syscall
这很有意义,因为参数始终以$ a1的字对齐偏移量存储。但是,假设第一个程序参数是“ jklfjdsaklfjdsklfjsdklfjsklfjsklfjsdaklfjlsdkjfjfksalfjsadlkf”。这个巨大的字符串无法容纳在0($ a1)和4($ a1)之间的四个字节中。但是代码仍然可以运行并打印字符串。为什么?
又如何将整个字符串放入$ a0中?再次因为它真的不合适。
答案 0 :(得分:1)
char fun0 ( char *x )
{
return(x[11]);
}
char fun1 ( char **x )
{
return(x[1][1]);
}
技巧
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
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是一个地址,编译器会传递该地址。如果您在不同级别上工作,则操作系统/环境将定义以这种方式传递命令行字符串,这将涵盖“为什么”问题。您没有提供足够的信息来回答问题。
它基本上与mips无关,它与某些针对mips的系统的实现有关。相同类型的实现也可以用于非mips目标。