solidity 内联汇编小结

soildity 内联汇编

欢迎大家参观我的博客

官方文档✈

1. 语法

solidity一样,Assembly 也会解析注释、文字和标识符,所以你可以使用通常的 ///* */ 来进行注释。 内联汇编程序由 assembly { ... } 来标记,在这些大括号内可以使用以下内容。

  • 字面常数,也就是 0x12342"abc" (不超过 32 个字符的字符串)
  • 操作码(在“instruction style”内),比如 mload sload dup1 sstore,操作码列表请看后面
  • 函数风格操作码,比如 add(1,mlod(0))
  • 标签,比如 name:
  • 变量声明,比如 let x := 7let x := add(y, 3) 或者 let x (初始值将被置为 empty(0))
  • 标识符(标签或者汇编局部变量以及用作内联汇编时的外部变量),比如 jump(name)3 x add
  • 赋值(在“instruction style”内),比如 3 =: x
  • 函数风格赋值,比如 x := add(y,3)
  • 一些控制局部变量作用域的语句块,比如 {let x := 3 { let y := add(x,1) }}

2. 常用操作码

注:在下表中,mem[a...b) 表示从位置 a 开始至(不包括)位置 b 的内存字节数,storage[p] 表示位置 p 处的存储内容。

Instruction Explanation
stop - F 停止执行,与 return(0,0) 等价
add(x, y) F x + y
sub(x, y) F x - y
mul(x, y) F x * y
div(x, y) F x / y
sdiv(x, y) F x / y,以二进制补码作为符号
mod(x, y) F x % y
smod(x, y) F x % y,以二进制补码作为符号
exp(x, y) F x 的 y 次幂
not(x) F ~x,对 x 按位取反
lt(x, y) F 如果 x < y 为 1,否则为 0
gt(x, y) F 如果 x > y 为 1,否则为 0
slt(x, y) F 如果 x < y 为 1,否则为 0,以二进制补码作为符号
sgt(x, y) F 如果 x > y 为 1,否则为 0,以二进制补码作为符号
eq(x, y) F 如果 x == y 为 1,否则为 0
iszero(x) F 如果 x == 0 为 1,否则为 0
and(x, y) F x 和 y 的按位与
or(x, y) F x 和 y 的按位或
xor(x, y) F x 和 y 的按位异或
byte(n, x) F x 的第 n 个字节,这个索引是从 0 开始的
shl(x, y) C 将 y 逻辑左移 x 位
shr(x, y) C 将 y 逻辑右移 x 位
sar(x, y) C 将 y 算术右移 x 位
addmod(x, y, m) F 任意精度的 (x + y) % m
mulmod(x, y, m) F 任意精度的 (x * y) % m
signextend(i, x) F 对 x 的最低位到第 (i * 8 + 7) 进行符号扩展
keccak256(p, n) F keccak(mem[p…(p + n)))
jump(label) - F 跳转到标签 / 代码位置
jumpi(label, cond) - F 如果条件为非零,跳转到标签
pc F 当前代码位置
pop(x) - F 删除(弹出)栈顶的 x 个元素
dup1 … dup16 F 将栈内第 i 个元素(从栈顶算起)复制到栈顶
swap1 … swap16 * F 将栈顶元素和其下第 i 个元素互换
mload§ F mem[p…(p + 32))
mstore(p, v) - F mem[p…(p + 32)) := v
mstore8(p, v) - F mem[p] := v & 0xff (仅修改一个字节)
sload§ F storage[p]
sstore(p, v) - F storage[p] := v
msize F 内存大小,即最大可访问内存索引
gas F 执行可用的 gas
address F 当前合约 / 执行上下文的地址
balance(a) F 地址 a 的余额,以 wei 为单位
caller F 调用发起者(不包括 delegatecall
callvalue F 随调用发送的 Wei 的数量
calldataload§ F 位置 p 的调用数据(32 字节)
calldatasize F 调用数据的字节数大小
calldatacopy(t, f, s) - F 从调用数据的位置 f 的拷贝 s 个字节到内存的位置 t
codesize F 当前合约 / 执行上下文地址的代码大小
codecopy(t, f, s) - F 从代码的位置 f 开始拷贝 s 个字节到内存的位置 t
extcodesize(a) F 地址 a 的代码大小
extcodecopy(a, t, f, s) - F 和 codecopy(t, f, s) 类似,但从地址 a 获取代码
returndatasize B 最后一个 returndata 的大小
returndatacopy(t, f, s) - B 从 returndata 的位置 f 拷贝 s 个字节到内存的位置 t
create(v, p, s) F 用 mem[p…(p + s)) 中的代码创建一个新合约、发送 v wei 并返回 新地址
create2(v, n, p, s) C 用 mem[p…(p + s)) 中的代码,在地址 keccak256(
. n . keccak256(mem[p…(p + s))) 上 创建新合约、发送 v wei 并返回新地址
call(g, a, v, in, insize, out, outsize) F 使用 mem[in…(in + insize)) 作为输入数据, 提供 g gas 和 v wei 对地址 a 发起消息调用, 输出结果数据保存在 mem[out…(out + outsize)), 发生错误(比如 gas 不足)时返回 0,正确结束返回 1
callcode(g, a, v, in, insize, out, outsize) F call 等价,但仅使用地址 a 中的代码 且保持当前合约的执行上下文
delegatecall(g, a, in, insize, out, outsize) F callcode 等价且保留 callercallvalue
staticcall(g, a, in, insize, out, outsize) F call(g, a, 0, in, insize, out, outsize) 等价 但不允许状态修改
return(p, s) - F 终止运行,返回 mem[p…(p + s)) 的数据
revert(p, s) - B 终止运行,撤销状态变化,返回 mem[p…(p + s)) 的数据
selfdestruct(a) - F 终止运行,销毁当前合约并且把资金发送到地址 a
invalid - F 以无效指令终止运行
log0(p, s) -
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BYYQ1030

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值