iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 15
2
Modern Web

謙虛,踏實的Web Assembly練習系列 第 15

[練習 14] global與start區段

  • 分享至 

  • xImage
  •  

global區段

顧名思義,global區段就是讓你定義global變數用的。

語法很簡單:

(global $var_name|index (mut type)|type (initialize_expression))

實際上一個可變的global變數,可以這樣定義:

(global $var1 (mut i32) (i32.const 0))

這樣就定義了一個叫做$var1的global變數,他的型別是可變的32位元整數,初始值是0。

如果不加上mut,就等於是定義一個global常數,例如:

(global $var0 i32 (i32.const 1))

這個變數,就只能用get_global $var0來取用,不能用set_global $var0來賦值。

initialize_expression目前只能使用兩種指令:

  1. const來指定一個常數
  2. 透過get_global從一個輸入的並且不可變的另一個global變數賦值

例如:

(import "js" "limit" (global $limit i32))
(global $con i32 (get_global $limit))

start區段

可以利用start區段,指定在WebAssembly程式實例化時,要執行的函數。語法很簡單:

(start $func_name)

例如要在初始化時從記憶體讀取一個輸入的數值,然後存入global變數:

(memory (import "js" "buf") 1)
(global $n (mut i32) (i32.const 0))
(start $init)
(func $init
    i32.load8_u
    set_global $n
)

測試一下

寫一個簡單的例子來測試一下這兩個區塊的使用:

test016.wat

(module
	(memory (import "js" "buf") 1)
	(global $n (mut i32) (i32.const 1))
	(start $init)
	(data 0 (i32.const 3))
	(func (export "test") (result i32)
		get_global $n
	)
	(func $init
		i32.const 0
		i32.load8_u
		set_global $n
	)
)

html端:

<html>
<body>
	<div id="panel"></div>
	<script src="../wasm_util.js"></script>
	<script>
	let buf = new WebAssembly.Memory({initial: 1});
	let view = new Uint8Array(buf.buffer);
	view[0] = 5;
	let importObjects = {
		js: {
			buf: buf
		}
	};
	new Wasm('test016.wasm').getInstance(importObjects)
	.then(instance => {
		document.getElementById('panel').innerHTML = 'Result: ' + instance.exports.test();
	});
	</script>
</body>
</html>

其實就是簡單地測試一下,會從$n這個global取出什麼數值。在WebAssembly程式中,會透過data區段把Memory的第一個byte設為3,global變數$n初始值是1,從Javascript環境中輸入到WebAssembly的Memory,則把第一個byte設為5。這樣在start區段執行$init函數,把global變數$n設為Memory的第一個byte。

測試結果:

Imgur

結果是取到從Javascript輸入的Memory的第一個byte。


大致上簡單的WebAssembly程式大概就像這幾天介紹的這樣,明天來整理一下各種指令的列表。


上一篇
[練習 13] 在Web Worker跑WebAssembly
下一篇
[練習 15] 整理一下關於WebAssembly指令的文件
系列文
謙虛,踏實的Web Assembly練習20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言