assembly 四数取大实性汇编码

myss37ts  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(172)

我正在尝试创建一个函数来查找作为参数输入的4个数字中的最大值。
使用Solidity汇编代码。
我已经做了一个成功的最大的2个数字已经,但似乎不能弄清楚这一个。
这是我的代码,每次都返回0

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.26;

contract LargestOfFourNums {
    function largestOfFour(
        uint256 num1,
        uint256 num2,
        uint256 num3,
        uint256 num4
    ) public view returns (uint256 result) {

        assembly {
            let winnerA := gt(num1, num2)
            let winnerB := gt(num3, num4)
    

            jumpi(num1Greater, gt(winnerA, winnerB))
            jump(num2Greater)

        num1Greater:
            result := winnerA
            jump(end)
        num2Greater:
            result := winnerB
        end:
        }
    }
}

我尝试过使用mstore(0x80,winnerA)
但这似乎并没有改变什么。
我甚至尝试了sload(0x80)和sload(winnerA),以便稍后调用它

gcmastyq

gcmastyq1#

为什么要进行额外的跳转?jump(num2Greater)无论如何都是冗余的。在其中一种情况下,您可能会让代码“失败”。
可以使用next方法获取两个32位整数的最大值和最小值:

c = a - b
k = (c >> 31) & 1
max = a - k * c
min = b + k * c

这允许无分支解决方案:

assembly {
    let maxA := sub(num1, mul(lt(num1, num2), sub(num1, num2)))
    let maxB := sub(num3, mul(lt(num3, num4), sub(num3, num4)))
    result   := sub(maxA, mul(lt(maxA, maxB), sub(maxA, maxB)))
    }

相关问题