关键词:
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
指令相当于一个无参的内联(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
指令在执行时不会使用栈上已经存在的任何操作数,执行完毕后可能会在栈顶留下一个操作数,下面是它的示意图:
][...
➘
( ;; ... 100)
)
)
block ][rt ]...[ br ]...[ end ][...
| ↑
└────────┘
loop ][rt ]...[ br ]...[ end ][...
↑ |
└───────────────┘
if
和block
指令类似,if
指令也类似于一个内联函数。区别主要有两点。第一,if
内联函数带一个i32
类型的参数。第二,if
内联函数带有两份代码(两条分支),中间用else
指令隔开。if
指令执行时,会先从栈顶弹出这个i32
类型的参数,如果参数值不等于0,则执行分支1代码,否则执行分支2代码。下面是if
指令的示意图:
][ rt ][ instrs1 ][ ][ instrs2 ][ ][...
][ ][ instrs1 ][ ][...
(func $max (param $a i32) (param $b i32) (result i32)
(i32.gt_s (local.get $a) (local.get $b))
((result i32)
((local.get $a))
((local.get $b))
)
)
(func (export (i32. (i32. (i32. (i32. ) (i32. ) (i32. ) (i32. )
(before br) n== n== n== n==
br_if
br_if
指令从栈顶弹出一个i32
类型的操作数,如果操作数的值为0,则不跳转,否则执行br
逻辑。下面是br_if
指令的示意图:
(func (i32) (i32) (result i32)
(local i32)
(loop ;; += (local.set (i32.add (local.get ;; (local.set (i32.add (local.get ;; <=
(br_if (i32.le_s (local.get )
;; (local.get )
($ (block
(block
(local.get $n)
)
(local.get 1))
)
(local.get 2))
)
(local.get 3))
)
int32) int32
n
: a
: b
*本文由CoinEx Chain开发团队成员Chase撰写。CoinEx Chain是全球首条基于Tendermint共识协议和Cosmos SDK开发的DEX专用公链,借助IBC来实现DEX公链、智能合约链、隐私链三条链合一的方式去解决可扩展性(Scalability)、去中心化(Decentralization)、安全性(security)区块链不可能三角的问题,能够高性能的支持数字资产的交易以及基于智能合约的Defi应用。
web前端之javascript的插件下载指令及介绍npminstallsaverequire(代码片段)
...据之间的转换下载安装指令npminstallmj-tree-structure--save功能介绍本插件主要有两个功能。功能一:扁平结构的数据转化成树形结构的数据 查看详情
freescale飞思卡尔hc9s12系列单片机flash擦写详解之flash控制器指令执行(代码片段)
前面我们介绍了Flash主要的几个寄存器,如果还有其他的疑问可以再返回去看看或者直接查阅S12系列单片机的手册中相关的内容。这一节我将介绍Flash控制器指令执行的过程,并举出相关的例子,希望能够起到举一反三的效... 查看详情
blazor_wasm之2:razor语法(代码片段)
...lar、React、VueJs和Svelte)的模板化引擎,本文针对Razor文件介绍Razor常用语法。Razor语法参考Razor语法@*直接输出变量*@<p>@Name</p>@*如果就像输出@,则使用另个@*@<p>@@Name</p>@*如果是明显的邮箱格式则按邮箱格式输出*@... 查看详情
wasm逆向分析(代码片段)
wasm是基于堆栈的虚拟机的二进制指令格式。在这次比赛中遇到,记录一下。 IDA反编译插件下载地址:https://github.com/fireeye/idawasm 食用方法:installthepythonmodule: python.exesetup.pyinstallmanuallyinstalltheWebAssemblyfileloader: 查看详情
vueday01前端发展介绍vue的快速使用插值语法指令系统之文本指令事件指令属性指令(代码片段)
目录前端发展介绍Vue框架入门M-V-VM思想组件化开发单页面应用Vue的快速使用前期准备快速使用对象与标签绑定查看Vue对象插值语法三目运算符指令系统之文本指令v-text和v-htmlv-show和v-if指令系统之事件指令v-ones6简化写法给函数传... 查看详情
web前端之vue的插件下载指令及介绍npminstallsave(代码片段)
...单导航、递归插件1、下载命令npminstallmj-menu--save2、参数介绍参数描述是否必须mjMenuTree数据源trueselectCallback菜单激活的回调falseopenCallbacksub-menu展开的回调falsecloseCallbacksub-menu收起的回调false3、局部使用html<template>< 查看详情
gdb再学习(11):如何生成core文件(代码片段)
...xff09;:程序准备GDB再学习(5):常用指令介绍GDB再学习(5.1):常用指令介绍_print/display_查看变量或寄存器中的值GDB再学习(5.2):常用指令介绍_examine_查看内存区域的数值GDB再学习(5... 查看详情
vue学习之路8-v-on指令学习简单事件绑定之属性(代码片段)
前言上一篇文章以v-on指令绑定click事件为例介绍了v-on指令的使用方法,本文介绍一下v-on绑定事件的一些属性的使用方法。v-on绑定指令属性 .stop属性阻止单击事件继续向上传播(简单点说就是不让父节点及... 查看详情
jvm进阶之字节码指令概述(代码片段)
字节码指令概述1.基本介绍2.执行模型3.数据类型4.指令分类1.基本介绍Java字节码指令对于虚拟机,就好比汇编语言对于计算机,都属于基本执行指令。Java字节码指令由一个字节长度的、代表着某种特定操作含义的数字ÿ... 查看详情
web前端之javascript的插件下载指令及介绍npminstallsaverequire(代码片段)
...的转换1、下载安装指令npminstallmj-tree-structure--save2、功能介绍本插件主要有两个功能。功能一:扁平结构的数据转化成树形结构的数据,关键点在于扁平结构的数据必须有一个字段存储其父级id。更能二:树形结构的... 查看详情
css介绍之二(代码片段)
CSS盒子模型margin:用于控制元素与元素之间的距离;margin的最基本用途就是控制元素周围空间的间隔,从视觉角度上达到相互隔离开的目的。padding:用于控制内容与边框之间的距离border(边框):围绕咋内边距和内容外的边框co... 查看详情
大数据之路之linux篇(代码片段)
...终端远程登录)2.5Linux开关机、重启2.6Linux的主要目录介绍3.Linux实操进阶篇3.1Linux运行级别及找回root密码3.2Linux实用指令3.2.1帮助指令man、help3.2.2文件目录类指令3.2.6文件查看指令3.2.7日历指令date、cal3.2.8查找指令find、location、... 查看详情
android_一如何获取linux中的可执行文件指令之termux使用介绍(代码片段)
一.方案背景我们知道安卓系统底层是基于Linux的,在Linux中有非常多,实用且方便的指令,android在进行二次封装后,并没有完全集成所有指令,但在很多场景我们又想借助某些指令协助我们进行一些操作,因此掌握获取这些指令... 查看详情
汇编基础之三--汇编指令(代码片段)
指令详细的指令介绍:https://blog.csdn.net/bjbz_cxy/article/details/79467688常用的汇编指令有:mov指令,在内存中写入以一个数,将寄存器的值写入内存,将内存中的值写入寄存器。寄存器使用名称指定,内存使用一个内存地址编号指定。... 查看详情
sla打印机之打印机介绍(代码片段)
SLA打印机结构以及原理介绍SLA打印机SLA:StereolithographyApparatus,立体光刻设备。通过光聚合逐层的创建模型。打印机结构如图所示的SLA打印机1刮刀,2打印部分,3树脂,4打印平台,5升降舵,6树脂槽,7激光光线,8,9激光振镜,10UV激光器可能... 查看详情
vue基础进阶之自定义指令(代码片段)
...的使用:在自定指令的名称前加上v-;自定义指令的详细介绍网址:https://cn.vuejs.org/v2/guide/custom-directive.html 下面是关于这个5个钩子函数的示例; vue代码: Vue.directive(‘demo‘,//指令的钩子函数bind()alert("bi... 查看详情
goweb(下)之模板引擎会话控制客户端(代码片段)
GoWeb(下)之模板引擎、会话控制、客户端一、模板引擎1.1HelloWord1.2解析模板1.3执行模板1.4引入静态资源1.5动作1.5.1.1.5.2条件动作1.5.3迭代动作1.5.4设置动作1.5.5定义、嵌套模板1.5.6块动作1.6修改默认的标识符二、会话控制2.... 查看详情
运动控制卡应用开发教程之调用激光振镜控制(代码片段)
运动控制卡应用开发教程之调用激光振镜控制✨博主介绍前言激光振镜控制开发流程查看PC函数手册了解其用法项目实操之激光振镜打标例程✨博主介绍💂个人主页:苏州程序大白💂个人社区:CSDN全国各地程序猿🤟作... 查看详情