.data
equation : .space 256
equal : .string "="
error_msg : .string "incorrect operation !"
comma : .string ", "
.text
main:
jal x1, test
jal ra, get_equation
mv t0, a0
addi t1, zero, 41
la t2, equation
lb a0, (t2)
li a7, 11
print:
ecall
addi t2, t2, 1
lb a0, (t2)
bge a0, t1, print
la a0, equal
li a7, 4
ecall
addi t1, zero, 1
mv a0, t0
beq x11, t1, signed
li a7, 36
beq zero, zero, unsigned
signed:
li a7, 1
unsigned :
ecall
addi t1, zero, 3
bne x11, t1, remainder
la a0, comma
li a7, 4
ecall
mv x10, x14
li a7, 1
ecall
remainder:
li a0, 0
li a7, 93
ecall
ebreak
get_equation :
la a0, equation
li a1, 256
li a7, 8
ecall
addi sp, sp, -4
sw ra, 0(sp)
addi s10, zero, 1
slli s10, s10, 3
addi s10, s10, 2
jal ra, get_first_int
jal ra, get_operation_symbol
lw ra, 0(sp)
addi sp, sp, 4
jalr zero, 0(ra)
get_first_int :
mv s8, ra
first_int_loop:
lb t0, (a0)
addi t0, t0, -48
blt t0, zero, get_operation
add s0, s0, t0
mv s9, x11
addi sp, sp, -8
sw a0, 4(sp)
sw s10, 0(sp)
mv x12, s0
mv x13, s10
jal ra, Mul
mv s0, a0
lw s10, 0(sp)
lw a0, 4(sp)
addi sp, sp, 8
mv x11, s9
addi a0, a0, 1
beq zero, zero, first_int_loop
get_operation :
mv t3, zero
addi t0, t0, 48
addi t1, zero, 43
beq t0, t1, symbol
addi t1, zero, 45
addi t3, t3, 1
beq t0, t1, symbol
addi t1, zero, 42
addi t3, t3, 1
beq t0, t1, symbol
addi t1, zero, 47
addi t3, t3, 1
symbol:
mv x11, t3
mv s9, x11
addi sp, sp, -8
sw a0, 4(sp)
sw s10, 0(sp)
mv x12, s0
mv x13, s10
jal ra, Div
mv a7, a0
lw s10, 0(sp)
lw a0, 4(sp)
addi sp, sp, 8
mv x11, s9
addi a0, a0, 1
mv s0, zero
get_second_int :
lb t0, (a0)
addi t0, t0, -48
blt t0, zero, equation_exit
add s0, s0, t0
mv s9, x11
addi sp, sp, -8
sw a0, 4(sp)
sw s10, 0(sp)
mv x12, s0
mv x13, s10
jal ra, Mul
mv s0, a0
lw s10, 0(sp)
lw a0, 4(sp)
addi sp, sp, 8
mv x11, s9
addi a0, a0, 1
beq zero, zero, get_second_int
equation_exit :
mv s9, x11
addi sp, sp, -8
sw a0, 4(sp)
sw s10, 0(sp)
mv x12, s0
mv x13, s10
jal ra, Div
mv x13, a0
lw s10, 0(sp)
lw a0, 4(sp)
addi sp, sp, 8
mv x11, s9
mv x12, a7
mv ra, s8
jalr x0, 0(ra)
calc:
get_operation_symbol :
mv t0, zero
beq x11, t0, add
addi t0, t0,1
beq x11, t0, Sub
addi t0, t0, 1
beq x11, t0, Mul
addi t0, t0, 1
beq x11, t0, Div
la a0, error_msg
li a7, 4
ecall
li a0, 0
li a7, 93
ecall
ebreak
add:
addi x11, zero, 0
add x10, x12, x13
jalr x0, 0(ra)
Sub:
addi x11, zero, 1
not x13, x13
addi x13, x13, 1
add x10, x12, x13
not x13, x13
addi x13, x13, 1
jalr x0, x1, 0
Mul:
addi sp, sp, -8
sw x12, 4(sp)
sw x13, 0(sp)
addi x11, zero, 2
mv x10, zero
mv t2, zero
addi t3, x0, 1
addi t4, x0, 33
addi t5, x0, 1
Mul_loop:
and t2, x13, t5
bne t2, t5, Mul_else
add x10, x10, x12
Mul_else:
slli x12, x12, 1
srai x13, x13, 1
addi t3, t3, 1
ble t3, t4, Mul_loop
lw x12, 4(sp)
lw x13, 0(sp)
addi sp, sp, 8
jalr x0, 0(ra)
Div:
mv s5, x12
mv s6, x13
addi sp, sp, -4
sw ra, 0(sp)
slli x13, x13, 16
addi t3, zero, 1
addi t4, zero, 18
mv t6, zero
Div_loop :
jal x1, Sub
bge x10, zero, Div_else
add x10, x10, x13
beq zero, zero, Div_exit
Div_else:
ori t6, t6, 1
Div_exit:
slli t6, t6, 1
srli x13, x13, 1
addi x12, x10, 0
addi t3, t3, 1
blt t3, t4, Div_loop
mv x14, x10
srli t6, t6, 1
mv x10, t6
mv x12, s5
mv x13, s6
lw ra, 0(sp)
addi sp, sp, 4
addi a1, zero, 3
jalr x0, 0(ra)
.include "common.asm"