内容纲要

WebAssembly

例句

语义

类型

  • i32: 32-bit 整型

  • i64: 64-bit 整型

  • f32: 32-bit 浮点型

  • f64: 64-bit 浮点型

  • i32.load8_s: 加载1字节, 将8位整数零扩展为32位整数

  • i32.load8_u: 加载1字节, 将8位整数零扩展为32位整数

  • i32.load16_s: 加载2字节, 将16位整数符号扩展为32位整数

  • i32.load16_u: 加载2字节, 将16位整数零扩展为32位整数

  • i32.load: 加载4字节,转换为32位整数

  • i64.load8_s: 加载1字节, 将8位整数符号扩展为64位整数

  • i64.load8_u: 加载1字节, 将8位整数零扩展为64位整数

  • i64.load16_s: 加载2字节, 将16位整数符号扩展为64位整数

  • i64.load16_u: 加载2字节, 将16位整数零扩展为64位整数

  • i64.load32_s: 加载4字节, 将32位整数符号扩展为64位整数

  • i64.load32_u: 加载4字节, 将32位整数零扩展为64位整数

  • i64.load: 加载8字节,转换为64位整数

  • f32.load: 加载4字节,转换为32位浮点数

  • f64.load: 加载8字节,转换为64位浮点数

  • i32.store8: 将32位整数包装为8位整数, 存储1字节

  • i32.store16: 将32位整数包装为16位整数, 存储2字节

  • i32.store: (不转换) 存储4字节

  • i64.store8: 将64位整数包装为8位整数, 存储1字节

  • i64.store16: 将64位整数包装为16位整数, 存储2字节

  • i64.store32: 将64位整数包装为32位整数, 存储4字节

  • i64.store: (不转换) 存储8字节

  • f32.store: (不转换) 存储4字节

  • f64.store: (不转换) 存储8字节

局部变量

  • get_local: 获取局部变量当前值
  • set_local: 设置局部变量当前值
  • tee_local: 类似 set_local, 设置局部变量当前值后返回被设置的新值

全局变量

  • get_global: 获取全局变量的当前值
  • set_global: 设置全局变量的当前值 ——set_global 设置不可变全局变量索引会导致验证异常

控制结构与指令

  • nop: 无操作, 无效果
  • block: 一个块结构的开始,以一个标记结尾的指令序列
  • loop: 一个开头有标记的块,可以用来形成循环
  • if: 一个具有隐式_then_块的if结构的开始
  • else: 标记if指令的else块
  • br: 到封闭结构中给定标记的分支
  • br_if: 到封闭结构中给定标记的条件分支
  • br_table: 跳表, 跳转到封闭结构中的标记
  • return: 函数返回0或多个值
  • end: 标记块、循环,if或函数的结束的指令

块的组成包括匹配的blockend 指令对、 匹配的loopend 指令对、 ifend 或者 ifelseend 序列的条件语句 。每个结构中的省略号中的指令被称作被_封闭_在结构中。

调用

  • call: 直接函数调用
  • call_indirect: 间接函数调用——call_indirect _动态_地对比调用者期待的签名和被调用者的函数签名 ,如果不匹配则产生中断。

常量

  • i32.const: 产生一个i32类型的立即数
  • i64.const: 产生一个i64类型的立即数
  • f32.const: 产生一个f32类型的立即数
  • f64.const: 产生一个f64类型的立即数

32位整型运算符

  • i32.add: 符号不可知加法
  • i32.sub: 符号不可知减法
  • i32.mul: 符号不可知乘法 (lower 32-bit)
  • i32.div_s: 有符号除法 (结果截断为零)
  • i32.div_u: 无符号除法 (结果 向下求整)
  • i32.rem_s: 有符号求余 (符号与被除数相同)
  • i32.rem_u: 无符号求余
  • i32.and: 符号不可知的的按位与
  • i32.or: 符号不可知的的按位或
  • i32.xor: 符号不可知的的按位异或
  • i32.shl: 符号不可知左移
  • i32.shr_u: 无符号右移(逻辑右移)
  • i32.shr_s: 有符号右移(算术右移)
  • i32.rotl: 符号不可知左循环
  • i32.rotr: 符号不可知右循环
  • i32.eq: 符号不可知的相等比较
  • i32.ne: 符号不可知的不相等比较
  • i32.lt_s: 有符号的小于
  • i32.le_s: 有符号的小于等于
  • i32.lt_u: 无符号的小于
  • i32.le_u: 无符号的小于等于
  • i32.gt_s: 有符号的大于
  • i32.ge_s:有符号的大于等于
  • i32.gt_u: 无符号的大于
  • i32.ge_u: 无符号的大于等于
  • i32.clz: 符号不可知的前导零位计数(如果值为零,所有零位都被认为是前导)
  • i32.ctz:符号不可知的拖尾零位计数(如果值为零,所有零位都被认为是的拖尾)
  • i32.popcnt: :符号不可知的一位计数
  • i32.eqz: 零值相等比较(如果操作数是0, 则返回1, 否则均返回0)

64位同理

浮点运算符

32位浮点运算符包括如下这些:

  • f32.add: 加法
  • f32.sub: 减法
  • f32.mul: 乘法
  • f32.div: 除法
  • f32.abs: 绝对值
  • f32.neg:非
  • f32.copysign: copysign(x, y)返回的值由x的不带符号的部分和y的符号组成。
  • f32.ceil: 向上取整运算符
  • f32.floor: 向下取整运算符
  • f32.trunc: 朝零方向舍入到最接近的整数
  • f32.nearest: 向偶数舍入到最接近的整数
  • f32.eq: 有序和相等比较
  • f32.ne:无序或不等比较
  • f32.lt: 有序和小于比较
  • f32.le: 有序和小于等于比较
  • f32.gt: 有序和大于比较
  • f32.ge: 有序和大于等于比较
  • f32.sqrt: 平方根
  • f32.min: 最小值(位运算符); 任何一个操作数是NaN, 则返回NaN
  • f32.max: 最大值(位运算符); 任何一个操作数是NaN, 则返回NaN

64位浮点运算符:

  • f64.add: 加法
  • f64.sub: 减法
  • f64.mul: 乘法
  • f64.div: 除法
  • f64.abs: 绝对值
  • f64.neg:非
  • f64.copysign: copysign(x, y)返回的值由x的不带符号的部分和y的符号组成。
  • f64.ceil: 向上取整运算符
  • f64.floor: 向下取整运算符
  • f64.trunc: 朝零方向舍入到最接近的整数
  • f64.nearest: 向偶数舍入到最接近的整数
  • f64.eq: 有序和相等比较
  • f64.ne:无序或不等比较
  • f64.lt: 有序和小于比较
  • f64.le: 有序和小于等于比较
  • f64.gt: 有序和大于比较
  • f64.ge: 有序和大于等于比较
  • f64.sqrt: 平方根
  • f64.min: 最小值(位运算符); 任何一个操作数是NaN, 则返回NaN
  • f64.max: 最大值(位运算符); 任何一个操作数是NaN, 则返回NaN

minmax运算符把t -0.0 视为小于 0.0.

浮点数比较中,如果任何一个操作数是NaN, 则操作数被当作是无序的, 否则就是有序的

数据类型转换, 截断, 重解释, 提升和降级

  • i32.wrap/i64: 将64位整数包装成32位整数
  • i32.trunc_s/f32:将32位浮点数截断成有符号32位整数
  • i32.trunc_s/f64: 将64位浮点数截断成有符号32位整数
  • i32.trunc_u/f32:将32位浮点数截断成无符号32位整数
  • i32.trunc_u/f64: 将64位浮点数截断成无符号32位整数
  • i32.reinterpret/f32: 将32位浮点数重解释为32位整数
  • i64.extend_s/i32: 将有符号32位整数扩展为64位整数
  • i64.extend_u/i32: 将无符号32位整数扩展为64位整数
  • i64.trunc_s/f32: 将32位浮点数截断为有符号64位整数
  • i64.trunc_s/f64: 将64位浮点数截断为有符号64位整数
  • i64.trunc_u/f32: 将32位浮点数截断为无符号64位整数
  • i64.trunc_u/f64: 将64位浮点数截断为无符号64位整数
  • i64.reinterpret/f64: 将64位浮点数重解释为64位整数
  • f32.demote/f64: 将64位浮点数降级为32位浮点数
  • f32.convert_s/i32: 将有符号32位整数转换为32位浮点数
  • f32.convert_s/i64: 将有符号64位整数转换为32位浮点数
  • f32.convert_u/i32: 将无符号32位整数转换为32位浮点数
  • f32.convert_u/i64: 将无符号64位整数转换为32位浮点数
  • f32.reinterpret/i32: 将32位整数重解释为32位浮点数
  • f64.promote/f32: 将32位浮点数提升为64位浮点数
  • f64.convert_s/i32: 将有符号32位整数转换为64位浮点数
  • f64.convert_s/i64: 将有符号64位整数转换为64位浮点数
  • f64.convert_u/i32: 将无符号32位整数转换为64位浮点数
  • f64.convert_u/i64: 将无符号64位整数转换为64位浮点数
  • f64.reinterpret/i64: 将64位整数重解释为64位浮点数

类型参数运算符

  • drop: 一元运算符,放弃操作数的值
  • select: 三元运行符,有两个相同类型的操作数,再加上一个布尔(I32)条件判断。如果条件操作数不为零,则返回第一个操作数,否则返回第二个操作数。

webassembly语义解释