我的系统编程课的一部分作业要求我们编写一个汇编模块,该模块返回一个 32 位整数中的位数,给定一个 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