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 に答える