この順序で時間値を入力するようにユーザーに依頼しようとしています。hours:min
たとえば、ユーザーは3:45
. ここで、時間の値を取得して何かを行いたいと考えています。次に、分の値を取得して別のことを行いたいと考えています。
mov %o0, %time
時間値を保存するために使用しています。ただし、次の 2 つの問題があります。
:
ユーザーが営業時間後に入力した場合、プログラムは実行されません。- 時間と時間の値を別々に取得する方法がわかりません。
どんな助けでも大歓迎です。
文字列入力を受け入れるために持っているサービスを使用してから、区切り文字を見つけて、両側の 2 つの数字を解析します。
更新:これはサンプル実装です。
! parse time in hh:mm format
! in: %o0 pointer to zero-terminated buffer
! out: %o0 hours, %o1 minutes
gettime:
save %sp, -64, %sp
! look for the colon in the string
! for simplicity, assume it always exists
mov %i0, %o0 ! use %o0 for pointer
colon_loop:
ldub [%o0], %o1 ! load next byte
cmp %o1, ':'
bne colon_loop
add %o0, 1, %o0
! ok, now we have start of minutes in %o0
! replace the colon by a zero
! and convert the minutes part
call atoi
stb %g0, [%o0-1]
! we now have the minutes in %o0, save it
mov %o0, %i1
! convert the hours
call atoi
mov %i0, %o0
! we now have hours in %o0
! return with hours,minutes in %o0,%o1 respectively
ret
restore %o0, %g0, %o0
! simple atoi routine
! in: %o0 pointer to zero-terminated string of digits
! out: %o0 the converted value
atoi:
mov %g0, %o1 ! start with zero
atoi_loop:
ldub [%o0], %o2 ! load next character
cmp %o2, 0 ! end of string?
be atoi_done
sub %o2, '0', %o2 ! adjust for ascii
! now multiply partial result by 10, as 8x+2x
sll %o1, 3, %o3 ! 8x
sll %o1, 1, %o1 ! 2x
add %o1, %o3, %o1 ! 10x
! now add current digit and loop back
add %o2, %o1, %o1
b atoi_loop
add %o0, 1, %o0
atoi_done:
retl
mov %o1, %o0