İşaretsiz çarpma işlemi ile işaretli sayıları çarpmak

A ve B n bitlik işaretli iki sayı olsun.

Elimizde işaretsiz sayıları çarpabilen rutin yada komut var ve amacımız A ve B işaretli sayılarını çarpmak.

Sa ve Sb, A ve B sayılarının işaret biti, A' ve B' ise, işaret biti atıldığında A ve B den kalan değerler olsun.

Bu durumda

A=-S_a2^{n-1} + A'
B=-S_b2^{n-1} + B'

AB=(-S_a2^{n-1} + A')(-S_b2^{n-1} + B')

C=AB=S_aS_b2^{2n-2} - 2^{n-1}(S_aB' +S_bA' )+ B'A'

Şimdi de A ve B sayılarının işaretsiz olduğunu varsayalım.

Bu durumda S, n-1 bitinin değeri olsun.

A=S_a2^{n-1} + A'
B=S_b2^{n-1} + B'

AB=(S_a2^{n-1} + A')(S_b2^{n-1} + B')

D=AB=S_aS_b2^{2n-2} + 2^{n-1}(S_aB' +S_bA' )+ B'A'

Komutumuz yada rutinimiz D sonucunu bulabildiğine göre bu D sonucuna X değerini eklediğimizde C yi bulmak isteyelim.

C=D+X den  X=C-D den olacaktır.

X=[S_aS_b2^{2n-2} - 2^{n-1}(S_aB' +S_bA' )+ B'A']-[S_aS_b2^{2n-2} + 2^{n-1}(S_aB' +S_bA' )+ B'A']

X=- 2^{n-1}(S_aB' +S_bA' )2=- 2^n(S_aB' +S_bA' )

A' ve B' yerine A ve B cinsinden değerlerini yazalım.

A'=A-S_a2^{n-1}
B'=B-S_b2^{n-1}

X=- 2^n(S_a(B-S_b2^{n-1}) +S_b(A-S_a2^{n-1}))
X=- 2^n(S_aB+S_bA) +2^{2n}(S_aS_b)

8 bitlik sayılar için hemen bir örnek yapalım.

A=-3  yani 0xFD
B=-5  yani 0xFB olsun

S_a=1
S_b=1

İşaretsiz çarpma sonucumuz D=0xFD*0xFB =0xF80F
işaretli çarpma sonucumuz C=2^{16} + 0xF80F - 2^8(FB+FD) =15 buluruz.

Tabiki böyle yapmayıp uzun yolu seçebilir ve işaretli sayıların mutlak değerlerini çarpıp sonucu işaret bitlerine göre modifiye edebilirsiniz.

Bu yazı 2- Arm ve Asm kategorisine gönderilmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.