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:从函数返回。