49 lines
1.1 KiB
ArmAsm
49 lines
1.1 KiB
ArmAsm
# RISC-V assembly program implementing a calculator.
|
|
|
|
.org 0
|
|
# Provide program starting address to linker
|
|
.global _start
|
|
|
|
.extern regdump
|
|
|
|
/* newlib system calls */
|
|
.set SYSEXIT, 93
|
|
.set SYSWRITE, 64
|
|
|
|
# .section .rodata
|
|
|
|
# .section .bss
|
|
|
|
.text
|
|
_start:
|
|
# do some adding
|
|
li a0, 0x80000000 # 0.5
|
|
li a1, 1 # 1
|
|
li a2, 0x80000000 # 0.5
|
|
li a3, 1 # 1
|
|
jal add64
|
|
#add t1, a0, 0 # copy a0 to t0 as end with overwrite it
|
|
jal regdump
|
|
|
|
li t0, SYSEXIT # "exit" syscall
|
|
add a0, x0, 0 # Use 0 return code
|
|
ecall # invoke syscall to terminate the program
|
|
|
|
# 64-bit integer addition
|
|
# arguments:
|
|
# a0: x lower 32 bits
|
|
# a1: x upper 32 bits
|
|
# a2: y lower 32 bits
|
|
# a3: y upper 32 bits
|
|
# return:
|
|
# a0: x+y lower 32 bits
|
|
# a1: x+y upper 32 bits
|
|
#
|
|
add64:
|
|
add a0, a0, a2 # add lower 32 bits
|
|
add t0, a1, a3 # add upper 32 bits
|
|
sltu t1, a0, a2 # if lower 32-bit sum < a2 then set t1=1 (carry bit)
|
|
add a1, t0, t1 # upper 32 bits of answer (upper sum + carry bit)
|
|
ret
|
|
|
|
|