From 8e968078e6aee470a02bed7728100b2df1877e90 Mon Sep 17 00:00:00 2001 From: Miquel Sabaté Solà Date: Mon, 12 Aug 2024 14:50:07 +0000 Subject: basics: Add some examples on RISC-V assembly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Miquel Sabaté Solà --- basics/factorial.S | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 basics/factorial.S (limited to 'basics/factorial.S') diff --git a/basics/factorial.S b/basics/factorial.S new file mode 100644 index 0000000..7e3df12 --- /dev/null +++ b/basics/factorial.S @@ -0,0 +1,28 @@ +.text +.globl factorial +.type factorial, @function + +factorial: + // If input <= 1, just return the given thing. + addi t0, zero, 1 + bgt a0, t0, else + jr ra +else: + // Preserve the argument and the return address before the call. + addi sp, sp, -16 + sd a0, 0(sp) + sd ra, 8(sp) + + // Call the same function but with a value of argument-1. + addi a0, a0, -1 + call factorial + + // Restore back the original argument and the return address. Then multiply + // the original argument with the returned one from the previous call. + ld t1, 0(sp) + ld ra, 8(sp) + addi sp, sp, 16 + mul a0, t1, a0 + + // And return to the caller. + jr ra -- cgit v1.2.3