整数基本运算
module test_05::test_move{
public fun test_integer(){
let i:u64 = 0;
let j = i+10;
let k = j-5;
let m = k*2;
let s = m/3;
let mod = m%3;
}
}
这个合约演示了最基本的五种运算:+ - * / %
下面我们通过下面的命令执行反编译:
move disassemble --name test_move
我们通过反编译可以得到如下指令:
// Move bytecode v5
module f2.test_move {
public test_integer() {
L0: i: u64
L1: j: u64
L2: k: u64
L3: m: u64
L4: mod: u64
L5: s: u64
B0:
0: LdU64(0)
1: StLoc[0](i: u64)
2: MoveLoc[0](i: u64)
3: LdU64(10)
4: Add
5: StLoc[1](j: u64)
6: MoveLoc[1](j: u64)
7: LdU64(5)
8: Sub
9: StLoc[2](k: u64)
10: MoveLoc[2](k: u64)
11: LdU64(2)
12: Mul
13: StLoc[3](m: u64)
14: CopyLoc[3](m: u64)
15: LdU64(3)
16: Div
17: Pop
18: MoveLoc[3](m: u64)
19: LdU64(3)
20: Mod
21: Pop
22: Ret
}
}
LdU64(0): 加载一个整数0到栈上
StLoc[0](i: u64):从栈上弹出一个值,这个值我们可以知道,就是i的值0,然后将这个值存入寄存器0
MoveLoc[0](i: u64):将i的值从寄存器0删除,并且压入栈
LdU64(10):加载第二个数字10到栈上
Add
这个操作是执行加法的汇编指令,下面我们看看实际代码实现:
Bytecode::Add => {
gas_meter.charge_simple_instr(S::Add)?;
interpreter.binop_int(IntegerValue::add_checked)?
}
实际使用了binop_int进行二元操作,传入的是操作函数,这里传入的是add_checked函数:
fn binop_int<F&