From d8a2faf732355443728bd7655eadaa518a3f143d Mon Sep 17 00:00:00 2001 From: Toby Jaffey Date: Sun, 7 Dec 2025 10:45:11 +0000 Subject: [PATCH] Minimal assembly example --- README.md | 1 + apps/Makefile | 2 ++ apps/hello-asm/Makefile | 27 +++++++++++++++++++++++++++ apps/hello-asm/hello-asm.s | 9 +++++++++ 4 files changed, 39 insertions(+) create mode 100644 apps/hello-asm/Makefile create mode 100644 apps/hello-asm/hello-asm.s diff --git a/README.md b/README.md index 111ec4f..753a6c2 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ The uvm32 memory size is set at compile time with `-DUVM32_MEMORY_SIZE=X` (in by * [host-parallel](host-parallel) parallel vm host running multiple vm instances concurrently, with baked in bytecode * [host-arduino](host-arduino) vm host as Arduino sketch (tested on Arduino Uno ATmega328P, uses 9950 bytes of flash/1254 bytes RAM) * [apps/helloworld](apps/helloworld) C hello world program + * [apps/hello-asm](apps/hello-asm) Minimal hello world assembly * [apps/fib](apps/fib) C fibonacci series program (iterative and recursive) * [apps/sketch](apps/sketch) C Arduino/Wiring/Processing type program in `setup()` and `loop()` style * [apps/rust-hello](apps/rust-hello) Rust hello world program (note, the version of rust installed by brew on mac has issues, use the official rust installer from https://rust-lang.org/learn/get-started/) diff --git a/apps/Makefile b/apps/Makefile index 2e08ac2..0ba8f46 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -6,10 +6,12 @@ all: (cd helloworld && make) (cd zig-mandel && make) (cd rust-hello && make) + (cd hello-asm && make) clean: (cd sketch && make clean) (cd helloworld && make clean) (cd zig-mandel && make clean) (cd rust-hello && make clean) + (cd hello-asm && make clean) diff --git a/apps/hello-asm/Makefile b/apps/hello-asm/Makefile new file mode 100644 index 0000000..5a0f92c --- /dev/null +++ b/apps/hello-asm/Makefile @@ -0,0 +1,27 @@ +PROJECT:=hello-asm + +DOCKER_IMAGE=riscv-dev +DOCKER_CMD:=docker run --rm -v ${PWD}../../../:/data -w /data/apps/${PROJECT} ${DOCKER_IMAGE} +PREFIX:=${DOCKER_CMD} riscv64-unknown-elf- +CFLAGS+=-I../../common +CFLAGS+=-fno-stack-protector +CFLAGS+=-static-libgcc -fdata-sections -ffunction-sections +CFLAGS+=-g -Os -march=rv32ima_zicsr -mabi=ilp32 -static +LDFLAGS:= -T ../linker.ld -nostdlib -Wl,--gc-sections +LIBS:= #-lgcc # needed for softfp + +SRCS=hello-asm.s + +all: + ${PREFIX}gcc -o ${PROJECT}.elf ${CFLAGS} ${LDFLAGS} ${SRCS} ${LIBS} + $(PREFIX)objcopy ${PROJECT}.elf -O binary ${PROJECT}.bin + +disasm: all + $(PREFIX)objdump -S -d -f ${PROJECT}.elf + +test: all + ../../host/host ${PWD}/${PROJECT}.bin + +clean: + rm -f ${PROJECT}.o ${PROJECT}.elf ${PROJECT}.bin + diff --git a/apps/hello-asm/hello-asm.s b/apps/hello-asm/hello-asm.s new file mode 100644 index 0000000..3c1fabe --- /dev/null +++ b/apps/hello-asm/hello-asm.s @@ -0,0 +1,9 @@ +.section .initial_jump , "ax", %progbits +.global _start +_start: +la a5, str +csrrw zero,0x13b,a5 # println +csrwi 0x138,0 # halt +str: +.ascii "Hi" +