2012-03-21 5 views
0

:私は第二部に到達したときシリーズの合計(x86アセンブリ)を計算する際に私のアルゴリズムに何が問題になっていますか?私は現在、次の式を使用して、一連の合計を取得しようとしている

((endNum * (endNum + 1)/2) - ((startNum * (startNum - 1)/2)

最初の部分が正常に動作しているようですが、しかし、それは私に問題を与えます。

; Formula and testing numbers 
; ----------------------------- 
;((x (x+1)/2) - ((y (y-1) /2) 
; 
; - x = 8 
; - y = -2 
; ----------------------------- 


ReadInt WORD[y]  ; read ending integer from user (8) 
ReadInt WORD[x]  ; read starting integer from user (-2) 

; ((x * (x + 1)/2) 

mov AX, [x] 
mov BX, [x]  
add BX, 1 
mul BL 
shr AX, 1 
mov [x], AX 


; ((y * (y - 1)/2) 

mov AX, [y]   ; -2 
mov BX, [y]   ; -2 
sub BX, 1   ; -3 
mul BL    ; <-- comes out with 1112 or some odd large number?? 
shr AX, 1 

sub [x], AX 

を私は問題が何であるかわからないんだけど、それは-2-3を乗算されたときに起こるようです。ここでは

は私がやっているものです。

誰かが私が間違っている箇所を指摘できますか?早くこれを編集するためのもの

EDIT
私は符号なしの数字を扱っていますから、私は、各番号をループに私のアルゴリズムを変更し、むしろ数式を使用しようとするよりも、それらを追加する必要がありました。もともと私はそれがループよりも効率的であると信じて以来、この公式を使用したかったのです。私が見ている

+1

8ビットレジスタのみを使用して乗算し、AHの上位8ビットをそのままにします。それらは最も以前から負数で詰め込まれている可能性が高いので、元の2の補数を無効なものに破棄しました。 –

+0

Btw、私はそれを強調することはできません、デバッガを使用して、どこがうまくいかないかを見てください。 –

+0

@MarcB返信いただきありがとうございます、私はあなたが正しいと思います。 – StartingGroovy

答えて

4

いくつかの問題:

  • を数字が署名されている場合は、あなたはそれらの乗算にIMULの代わりMULを使用する必要があります。
  • 数字が署名されている場合は、2の累乗で除算する方法としてSHRを使用できません。少なくともSARでなければならず、SHRでなければなりません。それでは、実際にはIDIVを使用して対称的な切り捨てを行うことをお勧めします。
  • どの部分が間違っているのか正確にはわかりませんが、入力値が16ビットの場合、入力値を切り捨てる可能性があるため、8ビット* 8ビット= 16ビット乗算は間違っています。同様に、入力された数値が8ビットの読取り値であっても、16ビットとして読み込まれている場合、通常は間違っているだけでなく、メモリやクラッシュなしでメモリ位置を踏み出すこともあります。

また、インテルまたはAMD x86 CPUのマニュアルでは、インストラクションがどのように機能し、どの命令を使用しているか、またそれらのインプットをどこから得るのか、出力との関係について説明しています。

+0

私はこの答えを1回以上投票することができたら、私は素晴らしい答えになるでしょう。 –

+0

@Alex申し訳ありませんが、私はすべての番号が署名されていないことを述べておくべきです。つまり、私はSHRで分割するのではなく、そうしたいと思ったらSARを使うべきです。私はまだアセンブリの学習段階にいる(明らかに)ので、アドバイスをいただきありがとうございます。私はデバッガをチェックします – StartingGroovy

+0

@Alex私はまた、私が行ったことで自分の投稿を更新しました。しかし、あなたの投稿とMarcのコメントの間に、私は間違いを認識しました。私の間違いを指摘してくれてありがとう。 – StartingGroovy

関連する問題