基于虚拟机源码分析move合约(二):整数基本运算

  整数基本运算

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&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值