【问题标题】:Encode Instructions of Stack-based language to Bytecode将基于堆栈的语言的指令编码为字节码
【发布时间】:2019-11-07 17:05:27
【问题描述】:

我如何使用诸如“PUSH_k x”之类的指令对任意大的 x 和 x 的字节数 k 的语言进行字节编码?

【问题讨论】:

  • 不清楚你想要什么,但也许你可以将长度本身放入编码中,类似于长度前缀字符串。
  • 有很多方法可以做到这一点。
  • 我只需要一种方法,我一直在寻找它,但没有什么比我的问题更接近了
  • 嗯,第一个在开头。您可以按顺序解码。这就是 x86 等可变长度指令集的工作方式。好的,除非您想使用更高级的编码,否则您确实需要长度字段本身的固定大小。如果您允许 32 位大小,您的示例将是 0x42 0x00 0x00 0x08 0x00 0x01 .... 0x01,即 1 字节操作码 + 4 字节长度 + 2048 字节常量。
  • 你真的是指任意大吗? k 可以大于 256,所以 k 本身可能需要多个字节来表示?有一些可变长度的数字编码方案可以用于真正的任意值,但希望不支持立即推送。

标签: assembly bytecode biginteger machine-code


【解决方案1】:

encoding variable length numbers有很多方法:

一种简单的方法是可变长度字节方法,它使用每个字节的一个位来判断值的另一个字节是否跟随。例如,在每个字节中,使用高位 = 1 表示至少还有一个字节 - 并使用高位 = 0 表示该字节是最后一个字节。

解码,这里变成int类型,是这样的:

int decodeVariableLengthNumber ( unsigned char *pc ) {
    int value = 0; // size here should accomodate the largest possible
    for(;;) {
       unsigned byte b = *pc++;
       value <<= 7;
       value |= b & 127;
       if ( b & 128 )
           continue;
       return value;
    }
}

而编码只是这个解码所需的相反。

这可以在每 8 位字节中编码 7 个数据/内容位,例如,从 0 到 127 的数字在一个字节中,从 0 到 16383 的数字在两个字节中。

如果这对应用程序更有意义,也可以使用偏移量,以便第一个字节编码 1..128 而不是 0..127。此外,两字节格式可能假设一个人不会对适合 1 字节格式的数字使用 2 字节编码,因此这些可能会偏移 127(或 128),以获得稍大的覆盖范围。

您可以通过这种方式对k 进行编码,然后为x 设置固定大小的k 字节——或者您可以直接以这种可变长度方式直接对x 本身进行编码,而不必对@987654331 进行编码@ 字节数。


其他值得考虑的食物:

  • self synchronizing encodings,它甚至可以在指令集架构中具有一些安全优势。
  • UTF-8 具有自同步属性的可变长度编码。
  • RISC VRISC V 支持 2 字节的倍数的可变长度指令。

【讨论】:

  • 谢谢你,你的建议似乎很实用,我会看看我是否能适应我的问题。另外,我将查找其他编码。
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多