3

私のシステム プログラミング クラスの課題の一部で、基数が 2 ~ 36 の範囲で指定された 32 ビット整数の桁数を返すアセンブリ モジュールを作成するように求められました。1 つのケースを除いて、すべて正常に動作します。最大符号付き正 32 ビット値0x7FFFFFFFと基数 を使用すると、コードは桁数として31ではなく322を返します。

num解決策として、引数が等しいかどうかを確認し、等しい場合は0x7FFFFFFF31 を返す命令を含めることで、このケースを処理することを考えました。ただし、そのアプローチが正しいかどうかはわかりません。

問題を解決するために、「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
4

0 に答える 0