私のシステム プログラミング クラスの課題の一部で、基数が 2 ~ 36 の範囲で指定された 32 ビット整数の桁数を返すアセンブリ モジュールを作成するように求められました。1 つのケースを除いて、すべて正常に動作します。最大符号付き正 32 ビット値0x7FFFFFFF
と基数 を使用すると、コードは桁数として31ではなく322
を返します。
num
解決策として、引数が等しいかどうかを確認し、等しい場合は0x7FFFFFFF
31 を返す命令を含めることで、このケースを処理することを考えました。ただし、そのアプローチが正しいかどうかはわかりません。
問題を解決するために、「do-while ループ」タイプのアルゴリズムを使用しています。
関数プロトタイプ:int numOfDigits( long num, int base );
.global numOfdigits
.section ".text"
numOfDigits:
save %sp, -96, %sp
clr %l0 ! digits = 0
mov %i0, %o0 ! num is first argument to .div
mov %i1, %o1 ! base is second argument to .div
loop:
call .div ! %o0 = %o0 / %o1
nop
inc %l0 ! ++digits
cmp %o0, 0 ! while ( num != 0 )
bne loop
nop
mov %l0, %i0 ! copy digits value into return register
ret
restore