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或函数的结束的指令
块的组成包括匹配的block
… end
指令对、 匹配的loop
… end
指令对、 if
… end
或者 if
… else
… end
序列的条件语句 。每个结构中的省略号中的指令被称作被_封闭_在结构中。
调用
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, 则返回NaNf32.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, 则返回NaNf64.max
: 最大值(位运算符); 任何一个操作数是NaN, 则返回NaN
min
和 max
运算符把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)条件判断。如果条件操作数不为零,则返回第一个操作数,否则返回第二个操作数。