使用基数2计算32位有符号整数中的位数会返回32而不是31

时间:2013-04-16 05:31:33

标签: assembly sparc

我的系统编程类的一部分赋值要求我们编写一个汇编模块,该模块返回32位整数中的位数,给定2到36(包括2和36)范围内的基数。 一切正常,除了一个案例。当我使用最大签名的正32位值0x7FFFFFFF2的基数时,代码返回 32 而不是 31 作为位数。

作为一个解决方案,我考虑通过包含检查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

0 个答案:

没有答案
相关问题