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

时间:2019-02-24 01:22:03

标签: mips

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

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

这很有意义,因为参数始终以$ a1的字对齐偏移量存储。但是,假设第一个程序参数是“ jklfjdsaklfjdsklfjsdklfjsklfjsklfjsdaklfjlsdkjfjfksalfjsadlkf”。这个巨大的字符串无法容纳在0($ a1)和4($ a1)之间的四个字节中。但是代码仍然可以运行并打印字符串。为什么?

又如何将整个字符串放入$ a0中?再次因为它真的不合适。

1 个答案:

答案 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目标。