我的系统编程类的一部分赋值要求我们编写一个汇编模块,该模块返回32位整数中的位数,给定2到36(包括2和36)范围内的基数。 一切正常,除了一个案例。当我使用最大签名的正32位值0x7FFFFFFF
和2
的基数时,代码返回 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