block
block
语句创建一个标签,后面可以用 br
跳出该块。
loop
语句和 block
语句的表现相反,跳转到 loop
会回到循环的开头,而跳转到 block
会达到块尾,也就是跳出块。
尝试一下
(module
;; 导入浏览器 console 对象,你需要将其从 JavaScript 传入
(import "console" "log" (func $log (param i32)))
;; 创建一个函数,接收一个数字作为参数,
;; 并当该数字不等于 100 时打印它。
(func (export "log_if_not_100") (param $num i32)
(block $my_block
;; 判断 $num 是否等于 100
local.get $num
i32.const 100
i32.eq
(if
(then
;; 跳转到块尾
br $my_block
)
)
;; 当 $num 等于 100 时,不会到达这里
local.get $num
call $log
)
)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console }).then(
(result) => {
const log_if_not_100 = result.instance.exports.log_if_not_100;
log_if_not_100(99);
// 期望的输出:99
log_if_not_100(100);
// 不应该打印任何东西
log_if_not_100(101);
// 期望的输出:101
},
);
语法
wat
;; 对块打标签,使其可以被跳转。
(block $my_block
;; 跳转到该块。
;; 大多数时候,你会想要将下面的指令放在 if 语句中,仅在符合条件时跳转,
;; 否则,后面的控制流就无法到达。
br $my_block
;; 永远不会到达这里,因为 br 早已经跳出了该块。
unreachable
)
指令 | 二进制操作码 |
---|---|
block |
0x02 |