SPARC でこの乗算アルゴリズムに数日間 (まっすぐ) 取り組んできました... 本当に何が問題なのかわかりません。コードを数回繰り返しました。提案された C アルゴリズムが望んでいることを実行しています。ここにCがあります
negative = multiplier >= 0 ? 0 : 1;
product = 0;
for (i = 0; i < 32; i++) {
if (multiplier & 1)
product += multiplicand;
(product and multiplier registers combined as a unit) >> 1;
}
if (negative)
product -= multiplicand;
これは SPARC Assembly にあります。負の数の機能はまだ実装していないことに注意してください。プログラムは提案された回数実行されます。したがって、ループは問題ではありません。私の問題は、現在(疑似コードで)2つの32ビットレジスタ間の右シフトをどのように説明しているかにあると思います
sra スモール レジスタ 1 if (ラージ レジスタの右端ビット = 1) スモール レジスタの左端ビットを 1 sra 大きいレジスタに変更する
しかし、非常に不安定な数値を取得しているため、計画どおりに機能していないようです
これが SPARC のプログラム全体です...皆さんが提供できる助けがあれば幸いです。
fmt: .asciz "Multiplicand: %d, Product: %8.8X%8.8X Counter: %d\n" !output statement
.align 4 !align formatting
.global main
main: save %sp, -96, %sp
set 82732983, %l0 !move multiplicand into register %l0
set 120490892, %l1 !move multiplier into register %l1
set 0, %l2 !initialize product variable at 0
set 1, %l3 !initialize counter variable to 1
ba test
mov 32, %l5 !put max loop value in a register
loop:
set fmt, %o0 !setup the format string for the print statement
mov %l0, %o1 !moving variables for printing
mov %l1, %o2
mov %l2, %o3
mov %l3, %o4
call printf
nop
postprint:
and %l1, 1, %l6 !bitwise and between multiplier and 1, store result in %l6
cmp %l6, 0 !comparison statement comparing the above to 1
be else !skip the addition if rightmost bit of multiplier is 0
nop
add %l0, %l2, %l2 !adding multiplicand and product
sra %l1, 1, %l1 !shifting multiplier right
and 1, %l2, %l6 !checking if rightmost bit of product is a 1
cmp %l6, 1 !conditional statement to check this
bl endif !if it's not a one, branch to zero
nop !non op
clr %o4
set 0x40000000, %o4 !put 0x40000000 in a register
or %l1, %o4, %l1 !if it is a one, bitwise do or with 0x40000000 to make a one in the leftmost bit of the multiplier
sra %l2, 1, %l2 !shift product to the right by 1
inc %l3 !increment counter variable
ba test !and branch to the testing statement
nop
endif:
clr %o5
sra %l2, 1, %l2 !arithmetic shift product right by one (first line of endif)
inc %l3 !increment counter variable
ba test
nop
else:
sra %l1, 1, %l1 !shift multiplier to the right
and %l2, 1, %l6 !check if rightmost bit of product is 1
cmp %l6, 1 !conditional statement to check this
bl endif !branch to endif if it's not
nop !nop
clr %o4
set 0x40000000, %o4 !put 0x40000000 in a register
or %l1, %o4, %l1 !if the rightmost bit is one, we use a bitwise or to place a 1 in the leftmost bit of the multiplier
sra %l2, 1, %l2 !then right arithmetic shift the product
inc %l3 !and increment the counter
ba test
nop
test: cmp %l3, %l5
bl loop
done: mov 1, %g1 !Exit the program
ta 0