WASI
Rust Hello World
$ rustup update
$ cargo init
$ cargo install cargo-wasi
$ cargo wasi build
$ wasmtime ./target/wasm32-wasi/debug/wasi-demo.wasi.wasm
- https://bytecodealliance.github.io/cargo-wasi/install.html
WAT Hello World
(module
;; Import the required fd_write WASI function which will write the given io vectors to stdout
;; The function signature for fd_write is:
;; (File Descriptor, *iovs, iovs_len, *nwritten) -> Returns 0 on success, nonzero on error
(import "wasi_snapshot_preview1" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32)))
(memory 1)
(export "memory" (memory 0))
;; Write 'hello world\n' to memory at an offset of 8 bytes
;; Note the trailing newline which is required for the text to appear
(data (i32.const 8) "hello world\n")
(func $main (export "_start")
;; Creating a new io vector within linear memory
(i32.store (i32.const 0) (i32.const 8)) ;; iov.iov_base - This is a pointer to the start of the 'hello world\n' string
(i32.store (i32.const 4) (i32.const 12)) ;; iov.iov_len - The length of the 'hello world\n' string
(call $fd_write
(i32.const 1) ;; file_descriptor - 1 for stdout
(i32.const 0) ;; *iovs - The pointer to the iov array, which is stored at memory location 0
(i32.const 1) ;; iovs_len - We're printing 1 string stored in an iov - so one.
(i32.const 20) ;; nwritten - A place in memory to store the number of bytes written
)
drop ;; Discard the number of bytes written from the top of the stack
)
)
$ wasmtime demo.wat
# or this
$ wat2wasm demo.wat
$ wasmtime demo.wasm
- https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-tutorial.md
target
https://doc.rust-lang.org/rustc/platform-support/wasm32-wasip2.html
$ rustup target add wasm32-wasip2
$ rustc ./src/main.rs --target wasm32-wasip2