[WASM] Create and Run a Native WebAssembly Function

In this introduction, we show a simple WebAssembly function that returns the square root of a number. To create this function we load up WebAssembly Explorer (https://mbebenita.github.io/WasmExplorer/), writing the native WAST code to create and export the function. We compile and download the resulting WebAssembly binary, loading this with the Fetch API and WebAssembly JavaScript API to call the function in the browser.

Demo Repo: https://github.com/guybedford/wasm-intro

 

 Every WebAssembly starts with Module:
(module

)

 

Define a function inside the module:

(module
 (func $sqrt

 )   
)

Now we defined a empty function, 

To add input and output we can do:

(module
  (func $sqrt
     (param $num f32) # Input: param is the keyword, $num is the param name, f32 is the type
     (result f32) # Output: result is the keyword, f32 is the type 
  )
)

 

Now we can define function body:

(module
  (func $sqrt 
    (param $num f32)
    (result f32)
    
    (f32.sqrt (get_local $num))  # call the function sqrt on f32, pass in the params $num though get_local function
  )
)

The calculation value will be the return value.

 

If we want to use the fucntion in Javascript, we need to export the function:

(module
  (export "sqrt" (func $sqrt)) # export the function call "sqrt" refer to $sqrt function we defined below
  (func $sqrt 
    (param $num f32)
    (result f32)
    
    (f32.sqrt (get_local $num))
  )
)

 

After "Assemble" it and "Download" the file, we can load in the project:

<!doctype>
<html>
    <header>
        <title>
            WASM
        </title>
        <script>
            fetch('./test.wasm')
                .then((res) => {
                    if(res.ok){
                        return res.arrayBuffer();
                    }
                    throw new Error('Unable to fetch WASM')
                })
                .then((bytes)=> {
                    return WebAssembly.compile(bytes);
                })
                .then(module => {
                    return WebAssembly.instantiate(module);
                })
                .then(instance => {
                    window.wasmSqrt =instance.exports.sqrt;
                })
        </script>
    </header>
</html>

 

Open the console,  we can type:

wasmSqrt(25) //5

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值