代码之家  ›  专栏  ›  技术社区  ›  mcjabberz

将固定大小内存边界上的本机代码与GCC/G++/AS对齐?

  •  4
  • mcjabberz  · 技术社区  · 15 年前

    我想知道是否有一种方法可以在固定大小的边界上对齐内存中已编译代码的段,这样我就可以直接计算从字节码的值跳转到的地址?数组的工作方式也差不多,但我不是从计算出的地址读取,而是跳到它。

    如果这是可能的,我将如何告诉编译器/汇编程序(gcc/g++/as)以这种方式对齐?

    3 回复  |  直到 15 年前
        1
  •  7
  •   Community Bob Smith    7 年前

    我知道这并不是你想要的,但这是用GCC实现字节码解释器的标准方法。

    GCC的“computed goto”或“labels as values”特性允许您将标签放入数组中,并高效地跳转到不同的字节码指令。看到了吗 Fast interpreter using gcc's computed goto . 还要看看这个相关的堆栈溢出问题: C/C++ goto ,和 GCC documentation on labels as values .

    执行此操作的代码如下所示:

    void* jumptable[] = {&&label1, &&label2};
    
    label:
      /* Code here... */
    
    label2:
      /* Other code here... */
    

    然后可以使用以下表格跳转到不同的说明:

    goto *jumptable[i];
    
        2
  •  0
  •   Max Lybbert    15 年前

    就我个人而言,我可能会在将数据加载到内存时使用数组,并且我会确保所有数据都从该数组中的有效索引开始。阵列是连续布置的,相对容易使用。克尼根和里奇的书 提到了使用 union 表示对齐,但这并不能使指针算法变得更简单。

        3
  •  0
  •   teambob    15 年前

    如果您使用的是linux,请使用posix\u memalign()。我确信Windows也有类似的功能。

    如果您想调整自己的代码,可以看看gcc __attribute__ 语法。