wasm介绍之5:控制指令(代码片段)

时间杠杆 时间杠杆     2022-11-28     522

关键词:


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指令在执行时不会使用栈上已经存在的任何操作数,执行完毕后可能会在栈顶留下一个操作数,下面是它的示意图:

  • ][...                                               (   ;; ...         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功能介绍本插件主要有两个功能。功能一:扁平结构的数据转化成树形结构的数据&#x 查看详情

    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全国各地程序猿🤟作... 查看详情