.data ; (c) 2016 Michał (Foxbond) Chraniuk
;*** Data for Read-Trap
ReadBuffer: .space 80
ReadPar: .word 0,ReadBuffer,80
;*** Data for Printf-Trap
PrintfPar: .space 4
SaveR2: .space 4
SaveR3: .space 4
SaveR4: .space 4
SaveR5: .space 4
SaveR6: .space 4
.text
.global czytaj
czytaj:
;*** save register contents
sw SaveR2,r2
sw SaveR3,r3
sw SaveR4,r4
sw SaveR5,r5
sw SaveR6,r6
;*** Prompt
sw PrintfPar,r1
addi r14,r0,PrintfPar
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
addi r1,r0,0
addi r4,r0,10 ;Decimal system
;sprawdzanie znaku
addi r6,r0,#0;
lb r3,0(r2)
seqi r5,r3,#43 ;+
bnez r5,plus
seqi r5,r3,#45 ;-
bnez r5,minus
j Loop
plus: addi r2,r2,1
j Loop
minus: addi r6,r0,#1
addi r2,r2,#1
Loop: ;*** reads digits to end of line
lbu r3,0(r2)
seqi r5,r3,10 ;LF -> Exit
bnez r5,Finish
subi r3,r3,48 ;´0´
multu r1,r1,r4 ;Shift decimal
add r1,r1,r3
addi r2,r2,1 ;increment pointer
j Loop
Finish: beqz r6,norm
sub r1,r0,r1
;*** restore old register contents
norm: lw r2,SaveR2
lw r3,SaveR3
lw r4,SaveR4
lw r5,SaveR5
lw r6,SaveR6
jr r31 ; Return
> Back