1

考虑如下所示的 C 源代码语句。

   struct person  
   {
      char name[30];  
      int id;  
      int points;  
   };  

   char Fmt[] = "Name: %s  ID: %d  Points: %d\n";  
   void display_one( struct person List[], int I )  
   {  
      printf( Fmt, List[I].name, List[I].id, List[I].points );  
   }  

完成下面的 SPARC 汇编语言代码段,使汇编语言语句的顺序与上面的 C 语句等价。

      .section ".data"
      .align   4
Fmt:   .asciz   "Name: %s  ID: %d  Points: %d\n"
      .global  display_one
      .section ".text"
      .align   4

display_one:
      save     %sp, -96, %sp
      smul     %i1, 40, %l1
      add      %i0, %l1, %l0
      set      Fmt, %o0
      mov      %l0, %o1
      ld       [%l0+32], %o2
      ld       [%l0+36], %o3
      call     printf
      nop
      ret
      restore

我想知道 smul %i1, 40, %l1 行在做什么。我不明白为什么它要乘以 40。如果有人能解释一下,那就太好了。谢谢。

4

1 回答 1

1

40是 的大小struct person

char name[30];   // 30 bytes
                 // 2 bytes padding to make the following int aligned
int id;          // 4 bytes
int points;      // 4 bytes

参数I乘以40计算 的地址List[I]

于 2012-11-14T06:33:59.113 回答