2016-10-10 7 views
1

整数を入力として受け取り、その整数の整数値を6.985倍したプログラムをARMアセンブリ言語で記述する必要があります。たとえば、36が入力として入力された場合、結果は251になります。浮動小数点数の乗算を行うARMアセンブリ言語プログラムを作成

組み込み関数add(2つの整数を加算)、mul(2つの整数を乗算)、divide(2つの整数を加算) )、getnum(ユーザからの入力として整数を取得する)、printnum(出力を画面に出力する)の3種類があります。

bl getnum 

mov r1, #1000 

bl divide 

mov r4, r0 

mov r5, r1 

bl printnum 

mov r0, r5 

bl printnum 

私の質問:

bl getnum 

mul r0, r0, #6985 

bl printnum 

ここで除算機能のための私のコードがあります:私のアプローチは、最初に6985を掛けおよび1000

ここMUL機能のための私のコードだことにより、その後、分割することです一度に乗算と除算を実行するにはどうすれば2つの方法を組み合わせることができますか?私はまだこの言語に慣れていないので、分割関数でgetnumを取り除き、それをmul関数と組み合わせる方法を知らない。

+0

使用しているARM命令セットとプロセッサフ​​ァミリは何ですか? Cortex-M4用ARMv7など?一般に、乗算と除算を同時に行う単一の命令はなく、一部のARMプロセッサには除算命令がありません。 – InfinitelyManic

+0

正確な精度要件がない場合は、* 57221を実行して、8192 = * 6.9849853515625で値を分割することができます。ポイントは、8192は2^13なので、除算は13ビット。 (より正確な精度を得るために、元の6.985の値に2を掛けて、それらを切り捨てる小数で十分満足できるまで、何倍に掛けたかを数えてください)。さもなければあなたのアプローチは有効で、あなたが何を求めているのか分からず、分割部分に 'mul'の結果を使用してください。あなたが2のべき乗で行くなら、それがオーバーフローする前に最大数が乗算されることを試してください。 – Ped7g

+0

2のべき乗による除算はもちろんシフト右です。左へのシフトは2のべき乗で乗算されます。 – Ped7g

答えて

0

getnum,divideおよびprintnumの実際の定義を含め、全体のコードを投稿する必要があります。

はのは、仮定しましょう:

  • getnumは、それはあなたのコードで参照されている機能はr1r0を分割し、中に結果を保存しr0
  • divideのどこかで(?コンソール)と店から整数を取得します同じレジスタ(何がr1なのかわからない、おそらく部門通知)。
  • printnumは、ちょうどr0の値を表示します。私の仮定が正しければ

、ちょうど一緒にあなたのコードを組み合わせた:

bl getnum 

mul r0, r0, #6985 
mov r1, #1000 

bl divide 

bl printnum 

ボーナス

をあなたはmulコマンドに同じレジスタを使用することはできません私の知る限り。すべてのARMに該当するかどうかは不明です。

+0

Cainkovs - はい、r0、r0 ...はCortex-A9、A53、およびM-4で動作します。ただし、乗算器(#6985)は、最初に別のレジスタに配置する必要があります。例えば、Cortex-A9 movw r9、#6985、Cortex-M4 ldr r9、#6985 *、Cortex-A53 mov x9,6985。*疑似命令 – InfinitelyManic

関連する問題