WEBassembly
2024年12月21日大约 3 分钟
来学wasm
什么是webassembly?
是一个虚拟机,对比js是一个文本型的,而webassembly是以堆栈为基础的二进制机器码的虚拟机
指令表
局部变量和全局变量操作符
local.get
:从局部变量中加载一个值到栈上。local.set
:将栈顶的值存储到指定的局部变量中。local.tee
:将栈顶的值存储到指定的局部变量中,并且将该值保留在栈上。global.get
:从全局变量中加载一个值到栈上。global.set
:将栈顶的值存储到指定的全局变量中。
常量加载操作符
i32.const
:将一个 32 位整数常量加载到栈上。i64.const
:将一个 64 位整数常量加载到栈上。f32.const
:将一个 32 位浮点数常量加载到栈上。f64.const
:将一个 64 位浮点数常量加载到栈上。
数学运算操作符--对栈顶的数据操作
i32.add
:两个 32 位整数相加。i32.sub
:两个 32 位整数相减。i32.mul
:两个 32 位整数相乘。i32.div_s
:两个 32 位整数相除(有符号)。i32.div_u
:两个 32 位整数相除(无符号)。i32.rem_s
:两个 32 位整数求余(有符号)。i32.rem_u
:两个 32 位整数求余(无符号)。
位运算操作符
i32.and
:两个 32 位整数进行按位与运算。i32.or
:两个 32 位整数进行按位或运算。i32.xor
:两个 32 位整数进行按位异或运算。i32.shl
:对一个 32 位整数进行左移位运算。i32.shr_s
:对一个 32 位整数进行有符号右移位运算。i32.shr_u
:对一个 32 位整数进行无符号右移位运算。i32.rotl
:对一个 32 位整数进行左旋转运算。i32.rotr
:对一个 32 位整数进行右旋转运算。
比较和关系运算操作符
i32.eq
:比较两个 32 位整数是否相等。i32.ne
:比较两个 32 位整数是否不相等。i32.lt_s
:比较第一个 32 位整数是否小于第二个(有符号)。i32.lt_u
:比较第一个 32 位整数是否小于第二个(无符号)。i32.gt_s
:比较第一个 32 位整数是否大于第二个(有符号)。i32.gt_u
:比较第一个 32 位整数是否大于第二个(无符号)。i32.le_s
:比较第一个 32 位整数是否小于等于第二个(有符号)。i32.le_u
:比较第一个 32 位整数是否小于等于第二个(无符号)。i32.ge_s
:比较第一个 32 位整数是否大于等于第二个(有符号)。i32.ge_u
:比较第一个 32 位整数是否大于等于第二个(无符号)。
控制流操作符
block
:开始一个代码块,可以包含多条指令。loop
:开始一个循环,可以包含多条指令。if
:条件执行,如果栈顶的值不为零,则执行if
块中的指令。else
:与if
配合使用,如果if
条件不满足,则执行else
块中的指令。br
:无条件跳转到指定的标签。br_if
:条件跳转,如果栈顶的值不为零,则跳转到指定的标签。br_table
:多路跳转,根据栈顶的值跳转到多个标签中的一个。return
:从函数返回。