br

br 语句跳转到循环(loop)标签、块(block)标签或 if 标签。

br 有两个变体,br_if 按条件进行跳转,br_table 则基于参数的值跳转到不同的块。

尝试一下

(module
  ;; 导入浏览器 console 对象,你需要将其从 JavaScript 传入
  (import "console" "log" (func $log (param i32)))

  ;; 创建一个全局变量并初始化为 0
  (global $i (mut i32) (i32.const 0))

  (func
    (loop $my_loop

      ;; 给 $i 加 1
      global.get $i
      i32.const 1
      i32.add
      global.set $i

      ;; 打印当前的 $1 值
      global.get $i
      call $log

      ;; 如果 $1 小于 10,则跳转到循环标签
      global.get $i
      i32.const 10
      i32.lt_s
      br_if $my_loop

    )
  )

  (start 1) ;; 自动运行第一个函数
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console });

语法

wat
;; 对循环打标签,使其可以被跳转
(loop $my_loop

  ;; 跳转到该循环。
  ;; 大多数时候,你会想要将下面的指令放在 if 语句中,仅在符合条件时跳转,
  ;; 否则,会进入无限循环。
  br $my_loop

)
指令 二进制操作码
br 0x0c
br_if 0x0d
br_table 0x0e