.include "syscall_numbers.s" .global atoi .global print_int .global println .global print .global print_a1 .global print_char .global strlen .global ltoa .global print_string atoi: addi sp,sp,-48 sd s0,40(sp) addi s0,sp,48 sd a0,-40(s0) sw zero,-20(s0) j .L2 .L3: lw a4,-20(s0) mv a5,a4 slliw a5,a5,0x2 addw a5,a5,a4 slliw a5,a5,0x1 sext.w a4,a5 lbu a5,-21(s0) sext.w a5,a5 addw a5,a5,a4 sext.w a5,a5 addiw a5,a5,-48 sw a5,-20(s0) .L2: ld a5,-40(s0) addi a4,a5,1 sd a4,-40(s0) lbu a5,0(a5) sb a5,-21(s0) lbu a5,-21(s0) andi a5,a5,255 bnez a5, .L3 lw a5,-20(s0) mv a0,a5 ld s0,40(sp) addi sp,sp,48 ret print_int: addi sp, sp, -8 sd ra,0(sp) lui a1, %hi(buf) addi a1, a1, %lo(buf) jal ra, ltoa mv a1, a0 jal ra, print_a1 ld ra, 0(sp) addi sp, sp, 8 jr ra print_a1: addi sp, sp, -8 sd ra,0(sp) mv a0, a1 jal ra, strlen ld ra, 0(sp) addi sp, sp, 8 mv a2, a0 li a0, 1 li a3, 0 li a4, 0 li a5, 0 li a6, 0 li a7, SYSCALL_WRITE ecall jr ra print_char: addi sp, sp, -8 sd ra, 0(sp) la a1, buf sb a0, 0(a1) sb zero, 1(a1) jal ra, print_a1 ld ra, 0(sp) addi sp, sp, 8 jr ra print: addi sp,sp,-32 sd ra,24(sp) sd s0,16(sp) addi s0,sp,32 sd a0,-24(s0) ld a0,-24(s0) jal ra,print_int jal ra,println nop ld ra,24(sp) ld s0,16(sp) addi sp,sp,32 ret strlen: addi sp,sp,-48 sd s0,40(sp) addi s0,sp,48 sd a0,-40(s0) sw zero,-20(s0) j .L6 .L7: lw a5,-20(s0) addiw a5,a5,1 sw a5,-20(s0) .L6: ld a5,-40(s0) addi a4,a5,1 sd a4,-40(s0) lbu a5,0(a5) bnez a5,.L7 lw a5,-20(s0) mv a0,a5 ld s0,40(sp) addi sp,sp,48 ret ltoa: mv a5,a0 addi a3,a1,20 sb zero,20(a1) li a1,0 bltz a0,.L27 .L22: li a2,10 j .L23 .L27: neg a5,a0 li a1,1 j .L22 .L26: mv a3,a0 .L23: rem a4,a5,a2 addiw a4,a4,48 sb a4,-1(a3) addi a0,a3,-1 div a5,a5,a2 bgtz a5,.L26 beqz a1,.L21 li a5,45 sb a5,-1(a0) addi a0,a3,-2 .L21: ret println: mv t6, ra lui a1, %hi(nl) addi a1, a1, %lo(nl) jal ra, print_a1 jr t6 print_string: addi sp, sp, -8 sd ra, 0(sp) addi sp, sp, -8 sd s0, 0(sp) addi sp, sp, -64 sd a0, 56(sp) sd a1, 48(sp) sd a2, 40(sp) sd a3, 32(sp) sd a4, 24(sp) sd a5, 16(sp) sd a6, 8(sp) sd a7, 0(sp) mv a1, a0 jal print_a1 ld a0, 56(sp) ld a1, 48(sp) ld a2, 40(sp) ld a3, 32(sp) ld a4, 24(sp) ld a5, 16(sp) ld a6, 8(sp) ld a7, 0(sp) addi sp, sp, 64 ld s0, 0(sp) addi sp, sp, 8 ld ra, 0(sp) addi sp, sp, 8 jr ra .section .rodata nl: .string "\n" .section .data buf: .string "XXXXXXXXXXXXXXXXXXXX"