2016-06-24 4 views
0

私はこの問題を解決するIASアセンブリ内のコード実装だ:アセンブリの対数の底2

Iは整数A=[a1,a2,...,an]のアレイを有し、IはB=[|log2 a1|,|log2 a2|,...,|log2 an|]を計算しなければならない、||ダウンに丸める床関数であります最も近い整数。

私は、次の手順を実装しようとしています:

  1. は最初|log2 x|を作成し、それが正の整数
  2. 走行1のために働くことを確認してください)、配列Aの各番号に配列を計算しますB

は、私がこれを書いたが、それは動作しません:

loop: S(x)->Ac+ n ;load n in AC 
     Cc->S(x) log ;if AC >= 0 jump to log 
     halt   ; else end the program 
     .empty 

log: S(x)->R resm ;copy number 2 to AR 
     S(x)*R->A two ;multiply 2*2 
     At->S(x) resm ;save in resm 
     S(x)->Ah+ one ;+1 counter 
     At->S(x) cont ;save the counter 
     S(x)->Ac+ n ;load n in AC 
     S(x)->Ah- one;decrease n in 1 
     At->S(x) n ;save n 
     Cu->S(x) loop; jump to beggining to make all again 

    n: .data 4 ;number to calculate log 
    two: .data 2 ;base of the logarithm 
    one: .data 1 ;for increase the counter 
    resm: .data 2 ;for save the result of the multiplication 
    cont: .data 0 ;save the result of the logarithm 

IASは、a simulatorで実装されている教授指導言語です。このページには、命令セットも記録されています。

+0

*どのように動作しないか、つまり実行時に何が起こるか、デバッガでどのように検出されたかを記述する必要があります。あなたのコードを実行しなくても問題は解決できるはずです。 –

+0

を作成するこの説明を参照してくださいまあ、私は私の問題を解決する方法を知っていないので、このシミュレータでもアセンブラでプログラミングする方法を理解していないので、 :ラベルは、単語の左半分にある行:20、列:0の命令でのみ使用できます。 – Ravield

+0

行20は 'cont:.data 0'行ですか?あなたはあなたの質問にそれを記すために編集を加えるべきです。行番号を取得するために 'cat -n'にコードブロックを貼り付ける必要がありました。 –

答えて

0

命令セットにdo this without loopingのlzcnt/bsrタイプの命令がないため、通常の方法では、すべてのビットをシフトアウトするのに必要な右シフトの数をカウントすることになります。

例えば:

floor(log2(x))

は、最上位ビットの位置を見つけるのと同じことです floor(log2(17)) = floor(log2(16)) = 4および floor(log2(15)) = 3
17と16の両方に5桁の2桁がありますが、15は 0b1111(4桁の4桁)です。

log2(0)が-Infinityであるため、入力がゼロの場合、関数は明確に定義されていません。残念ながら、x86's bsr instructionでも結果は未定義のままです。

twoの乗算に基づいて、x以上になるまで、1を左にシフトしてループしようとしていると思います。それは動作します。 (左シフトは2倍になります)。

あなたのコメントは約2 * 2という奇妙なことを言っています。

私はIASを知らず、コードがうまくいかないことについて何も言わなかった。質問の一部は、質問を更新して、あなたが期待していることをしていない1つの指示や、何かを特定するまで、あなた次第です。

関連する問題