0

-2<=x<=8 の範囲で x^3 -14x^2 +56x -64 の最大値を見つけるアセンブリ プログラムを作成する必要があり、最大値はプログラムの最後のレジスタの 1 つにある必要があります。 .

コードを C で書いたのですが、それを自分でアセンブリに変換する方法がわかりません。この時点で本当に混乱しています。ところで、自分で変換する必要があります。gcc を使用してアセンブリに変換できません。これは SPARC 用です

#include<stdio.h>
int  main()
{


int i;
int ans;

for (i = -2; i < 9; i++){
    ans = (i * i * i) - (14 * i * i) + (56 * i) - 64;
}
} 

私はアセンブリを書き込もうとしました。誰かがそれを批判して、私が正しい方向に進んでいるかどうか教えてもらえますか. また、最大数をテストするにはどうすればよいですか?

main:

  save  %sp, -96, %sp

  ba     test
  mov    -2, %a_r

loop: 

  mov    %a_r, %o0       !a_r moved into o0
  mov    %a_r, %o1       !a_r moved into o1
  call   .mul            !they are multiplied and stored in o0
  call   .mul            !they are multiplied again and stored in o0
  mov    %o0, r0         !results stored in r0
  mov    %a_r, %o0       !a_r moved into o0 and o1
  mov    %a_r, %o1
  call   .mul            !they are multiplied and stored in o0
  mov    14, %o1         
  call   .mul            !o0 result is multiplied by 14 and stored in r1
  mov    %o0, r1
  mov    56, %o0         !56 moved into o0
  mov    %a_r, %01       !a_r moved into o1
  call   .mul            !they are multiplied and stored in r2
  mov    %o0, r2         
  Sub    r0,r1,r0        !r0-r1 stored in r0
  Add    r0,r2,r0        !r0+r2 stored in r0
  Sub    r0,64,r0        !r0-64 stored in r0
  add    %a_r, 1, %a_r   !a_r + 1

test:
  cmp     %a_r %b_r      ! a_r<=8?
  ble     loop
4

1 に答える 1

1

あなたの答えは、あなたがターゲットにしているマシンに関する情報がないため、少し詳細が欠けています. これも宿題のように聞こえるので、完全な回答はしません。

ただし、(あらゆる種類の) アセンブリでループを実装するには、ラベルと分岐命令を使用する必要があります。

それ以外は、単純な合計と乗算です。iandansを 2 つの異なるレジスタに格納することに注意してください (結局、それらは異なる変数です)。

編集

あなたは正しい方向に進んでいるようです (私は SPARC について書いたことはありませんが、ドキュメントをざっと見てみると、あなたが正しい考えを持っていることがわかります)。最大数について: C/C++ でどのように処理しますか? それについて考えて、同じアセンブリをしてください!:)

于 2013-02-17T00:42:55.940 に答える