2017-06-07 12 views
-1

アセンブラでスイッチ、ケース構造を作成するには?正しい方法は何ですか?アセンブリ内のスイッチ、ケース構造を作成

これはC言語のコードで、アセンブラで記述したいものです。

私のプロジェクトでは、MMSP430F5XXが必要です。プロジェクトの条件は、アセンブラで1つのブレークルーチンが記述されていることです。そして、これはCでルーチンを壊すコードです。アセンブラで書くことを試みます。

#pragma vector=PORT2_VECTOR 
__interrupt void port2handler(void) 
{ 
    __delay_cycles(1000); 

    if (diode_on == 1) 
    { 
     switch(diode_num) 
      { 
      case 0: 
       if((P2IFG & BIT4)!=0) 
       { 
        if ((P2IN & BIT4)==0) 
         //score += 3; 
         calculationScore(3); 
       } 
       else 
        //score--; 
        calculationScore(-1); 
       break; 

      case 1: 
       if((P2IFG & BIT5)!=0) 
       { 
        if ((P2IN & BIT5)==0) 
         //score += 3; 
         calculationScore(3); 
       } 
       else 
        //score--; 
        calculationScore(-1); 
       break; 

      case 2: 
       if((P2IFG & BIT6)!=0) 
       { 
        if ((P2IN & BIT6)==0) 
         //score += 3; 
         calculationScore(3); 
       } 
       else 
        //score--; 
        calculationScore(-1); 
       break; 

      case 3: 
       if((P2IFG & BIT7)!=0) 
       { 
        if ((P2IN & BIT7)==0) 
         //score += 3; 
         calculationScore(3); 
       } 
       else 
        //score--; 
        calculationScore(-1); 
       break; 

      default: 
       break; 
      } 

     P4OUT &= ~(BIT3 | BIT4 | BIT5 | BIT6);   //gasimo diode 
     diode_on = 0; 
    } 

    P2IFG &= ~(BIT4 | BIT5 | BIT6 | BIT7);    // brisanje flega 
} 
+1

休憩付きのスイッチはelseと同じです –

+1

アーキテクチャにタグを付けることはできますか?私たちはそれなしでは答えることができません。 –

+0

我々は一般的にそれなしで答えることができます。それ以外の問題には他にもいくつかの問題があります。それは、この人に宿題の質問に対する答えを与えることを難しくしています。 –

答えて

1

これをコンパイルしたときに何を確認しましたか?コンパイラはどのようにそれを解決しましたか?

私の頭の上部には、これを実装する3つの簡単な方法がありますが、すべてを使用することはできません。第一に、if-then-elseツリーは常に機能し、場合によってはそれを行うための賢い方法があります。

それ以外のものは「それは依存している」と言って、たとえばコメントを外して0,1,2,3にスコアを3つ追加し、他のすべての値を追加しないようにしたかった...そして...

もちろんの
if(diode_num&3) goto skip; 
score+=3; 
skip: 

C(ご希望の場合はgotoなし)または構文で:diode_numは、あなたが/としてこれを実装することができ、これらの数字のうちのいずれか1つまたは75、あるいは4のようないくつかの他の値になる可能性これがどんなターゲットであれ、あなたのアセンブリ言語のために。

あなたが指定したコードがdiode_numに0,1,2,3しかない場合、これはデッドコードではありませんが、すべてのケースでscore + = 3に最適化され、スイッチは消えます。

そうでないと仮定して、別の「それは依存している」は、あなたのケースの値に依存するだけでなく、命令セットにも依存する可能性のあるすべての可能な値に依存するジャンプテーブルです。あなたが提供している、あなたが実際にあなたが提供したコードとして各ケースのために何かをしたと仮定すると、コードは、主に、それはあなたがより良い例を提供している必要があります

if(diode_on == 1) diode_on = 0; 

なっデッドコードです。コンパイラとオプティマイザがあなたが提供していないコードを見ることができ、diode_numの値の可能な範囲が0-7であり、0,1,2,3とジャンプテーブルのそれぞれに対して特別な処理コンパイラはそれがまたはジャンプテーブルをしようとすることを選択しない場合があります入力値の範囲を決定することができない場合は、この命令は、その後

load some_register,table_base_add 
shift_left temp_register,diode_num,2 ;assuming 32 bit addresses 
add some_register,temp_register 
load another_register,[some_register] 
branch_to another_register 

table_base_add: .word table_base 
.align 
;jump table 
table_base: 
.word case0 
.word case1 
.word case2 
.word case3 
.word switch_end 
.word switch_end 
.word switch_end 
.word switch_end 

;case 0 code 
case0: 
do something 
b switch_end 
;case 1 code 
case1: 
do something 
b switch_end 
;case 2 code 
case2: 
do something 
b switch_end 
;case 3 code 
case3: 
do something 
b switch_end 
switch_end: 
code after switch 

、あなたが指定していない設定で可能です。

ダイオードナンバーの範囲が厳密に0,1,2,3で、ケースごとに違うことをしたいと言っていましたが、これは非常に単純で、この場合は固定このさらなる最適化のためのサイズの指示。この場合

load some_register,base_add 
shift_left temp_register,diode_num,4 
add some_register,temp_register 
branch_to some_register 

base_add: .word base 
base: 
    ;case 0 code 
    one instruction 
    b switch_end 
    nop 
    nop 
    ;case 1 code 
    one instruction 
    one instruction 
    one instruction 
    b switch_end 
    ;case 2 code 
    one instruction 
    one instruction 
    b switch_end 
    nop 
    ;case 3 code 
    one instruction 
    nop 
    nop 
    b switch_end 
    switch_end: 

あなただけの追加またはまたはケース16倍をベースアドレスにして、そこにちょうど数学に必要な一切のジャンプテーブルをジャンプすることができなかった場合につき16バイト(4つの32ビット・ワード)を仮定。ケースが1,2,3,4だった場合は、1を減算してから16を掛けて(左に4シフト)、ベースに追加してそこにジャンプします。

最適化コンパイラなので、if then elseツリーを使用して実装することができます。また、入力範囲の詳細、ケース数、ケースごとのコード量あなたがコードして、それの周りにスケルトンを構築する最初のことです)と命令セットは、おそらく最適化することができます。

+0

明日私は実験室にいて、このアプローチをテストします。私はあなたに、どのように書いている.. :) – SakaSerbia

関連する問題