基于虚拟机源码分析move合约(六):整数、布尔值的引用

本文详细解读了一个Rust合约中的引用操作,包括不可修改引用(&)与可修改引用(&mut),展示了如何处理整数和布尔值的引用、读取和写入。通过反编译指令,深入剖析了Move字节码的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

合约:

 public fun test_reference(){
        let a = 1;
        let ref_a = &a;
        let b = *ref_a +1;
        let mut_ref_b = &mut b;
        *mut_ref_b = 3;
        let owner = false;
        let _ref_owner = &owner;
        let _mut_ref_owner = &mut owner;
    } 

这个合约演示了针对整数、布尔值的引用操作。引用分为两种:

& : 表示不可修改的引用

&mut :表示可以进行修改的引用

* :解引用

我们通过下面的命令执行反编译:

move disassemble --name test_move

我们可以得到如下指令:

// Move bytecode v5
module f2.test_move {


public test_reference() {
L0:     _mut_ref_owner: &mut bool
L1:     _mut_ref_v: &mut vector<u8>
L2:     _ref_owner: &bool
L3:     _ref_v: &vector<u8>
L4:     a: u64
L5:     b: u64
L6:     mut_ref_b: &mut u64
L7:     owner: bool
L8:     ref_a: &u64
L9:     v: vector<u8>
B0:
        0: LdU64(1)
        1: StLoc[4](a: u64)
        2: ImmBorrowLoc[4](a: u64)
        3: StLoc[8](ref_a: &u64)
        4: MoveLoc[8](ref_a: &u64)
        5: ReadRef
        6: LdU64(1)
        7: Add
        8: StLoc[5](b: u64)
        9: MutBorrowLoc[5](b: u64)
        10: StLoc[6](mut_ref_b: &mut u64)
        11: LdU64(3)
        12: MoveLoc[6](mut_ref_b: &mut u64)
        13: WriteRef
        14: LdFalse
        15: StLoc[7](owner: bool)
        16: ImmBorrowLoc[7](owner: bool)
        17: Pop
        18: MutBorrowLoc[7](owner: bool)
        19: Pop
        20: Ret
}
}

LdU64(1):加载整数1到栈上

StLoc[4](a: u64):将整数1从栈上取出,存入寄存器4

ImmBorrowLoc[4](a: u64)

这个指令用来对整数进行引用,具体代码如下:

Bytecode::MutBorrowLoc(idx) | Bytecode::ImmBorrowLoc(idx) => {
      let instr = match instruction {
           Bytecode::MutBorrowLoc(_) => S::MutBorrowLoc,
              _ => S::ImmBorrowLoc,
           };
           gas_meter.charge_simple_instr(instr)?;
           interpreter.operand_stack
                      .push(self.locals.borrow_loc(*idx as usize)?)?;
}

可以看到两种引用都会走locals.borrow_loc:

impl Locals {
    pub fn borrow_loc(&self, idx: usize) -> PartialVMResult<Value> {
        // TODO: this is very similar to SharedContainer::borrow_elem. Find a way to
        // reuse that code?

        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值