赣州新闻网

首页 / 科技

了不起的刘强东!!!

2020-03-05 · 赣州新闻网 · 科技

Wasm介绍之5:控制指令 | 火星技术帖

免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。

小编:记得关注哦

来源:CoinEx公链Talk

Wasm介绍之5:控制指令 | 火星技术帖

WebAssembly(简称Wasm)控制指令一共有11条,其中unreachable指令(操作码0x00)和nop指令(操作码0x01)比较简单,不介绍。call指令(操作码0x10)已经在上一篇文章里介绍,call_indirect指令(操作码0x11)将在下一篇文章里介绍。本文重点讨论block(操作码0x02)、loop(操作码0x03)、if(操作码0x04)、br(操作码0x0C)、br_if(操作码0x0D)、br_table(操作码0x0E)和return(操作码0x0F)这7条指令。

block

block指令相当于一个无参的内联(inline)函数调用。函数的返回值类型,也就是block指令的结果类型(Result Type,在后面的示意图中简称rt)编码后存储在指令的第一个立即数参数里。函数的指令(可能有很多条)编码后存储在第二个立即数参数里。block指令必须以end指令(操作码0x0B)结尾。由于end指令和后面将要介绍的else指令(操作码0x05)只起到标记作用,没有任何执行效果,所以没有把这两条指令计入控制指令。

Wasm1.0规范规定block指令的结果不能超过一个,所以rt可以用一个字节表示:0x40表示没有结果、0x7F表示i32类型、0x7E表示i64类型、0x7D表示f32类型、0x7C表示f64类型。根据讨论可知,block指令在执行时不会使用栈上已经存在的任何操作数,执行完毕后可能会在栈顶留下一个操作数,下面是它的示意图:

bytecode:
...]............[...

stack:
| | | |
| n(i32) |➚ | |
| d | | ? | # d

return

return指令可以认为是br指令的特殊形式:直接跳出最外层循环(也就是整个函数)。return指令没有立即数参数,不画示意图了。下面的WAT例子展示了如何用block、br_table和return指令实现Go等高级语言中的switch-case语句:

(module
(func $select3 (param $n i32) (param i32 i32 i32) (result i32)
(block
(block
(block
(local.get $n)
(br_table 0 1 2)
)
(return (local.get 1))
)
(return (local.get 2))
)
(return (local.get 3))
)
)

如果把上面例子中定义的select3函数翻译成Go语言代码的话,应该是下面这样:

func select3(n, a, b, c int32) int32 {
switch n {
case 0 : return a
case 1 : return b
default: return c
}
}

*本文由CoinEx Chain开发团队成员Chase撰写。CoinEx Chain是全球首条基于Tendermint共识协议和Cosmos SDK开发的DEX专用公链,借助IBC来实现DEX公链、智能合约链、隐私链三条链合一的方式去解决可扩展性(Scalability)、去中心化(Decentralization)、安全性(security)区块链不可能三角的问题,能够高性能的支持数字资产的交易以及基于智能合约的Defi应用。

投资中心文章代表交易结尾小编信息寻乌