Jump Table

在阅读Erts的代码的时候,尤其是在process_main这个函数的时候。看到一个奇怪的宏叫做NO_JUMP_TABLE,里面定义的数组opcodes[] = { DEFINE_OPCODES };其中DEFINE_OPCODES的定义是以&&开头的标签。

如下面的代码例子:

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define LabelAddr(Addr) &&Addr
int main(){
 void* opcodes[] = {&&lb_catch_end_y};
 opcodes[0] =  LabelAddr(lb_catch_end_y);
 free(opcodes);
 return 0;
lb_catch_end_y:
 printf("Never seen this \r\n");
 return 1;
}

其中lb_catch_end_y是goto标签,可以使用&&lb_catch_end_y来获得goto标签的地址。通过不断添加goto标签的地址到opcodes数组中,我们通过直接goto *opcodes[0]来进行跳转,当我们在运行时更换opcodes[0]中的地址,我们就会很方便的在这个函数内跳转来跳转去的,并且可以使用整个函数内所有的局部变量。

那么这东西可以干什么事情呢,通过这东西,我们就可以用C语言构造出高级语言所具有的尾递归。或者使用这个东西来构造自定义的执行流程,就像Erts的process_main那样的虚拟指令解释器。

时间: 2024-08-02 15:14:24

Jump Table的相关文章

uboot移植之start_armboot()函数分析

/******************************** uboot的第二阶段就是初始化剩下的还没在第一阶段初始化的硬件.主要是SoC外部硬件(譬如 iNand 网卡芯片....... )uboot本身的一些东西(uboot的命令 环境变量等.....).然后最终初始化完必要的东西后进入到uboot的命令行准备接受命令. ***********************************/ void start_armboot (void)       //这个函数构成了uboot

从底层简析Python程序的执行过程

摘要:是否想在Python解释器的内部晃悠一圈?是不是想实现一个Python代码执行的追踪器?没有基础?不要怕,这篇文章让你初窥Python底层的奥妙. [编者按]下面博文将带你创建一个字节码级别的追踪API以追踪Python的一些内部机制,比如类似 YIELDVALUE.YIELDFROM操作码的实现,推式构造列表(List Comprehensions).生成器表达式(generator expressions)以及其他一些有趣Python的编译. 关于译者:赵斌, OneAPM工程师,常年

【转】朱兆祺带你一步一步学习嵌入式(连载)

原文网址:http://bbs.elecfans.com/jishu_357014_2_1.html#comment_top  从最初涉及嵌入式Linux开始到现在,深深的知道嵌入式的每一步学习都是举步维艰.从去年11月份开始,我就着手整理各种学习资料,希望推动嵌入式学习的前进贡献自己微不足道的一份力量.从去年到现在,将C语言的学习经验整理成<攻破C语言笔试与机试陷阱及难点>(现在仍在更新),这份资料已经在电子发烧友论坛的单片机论坛连载(http://bbs.elecfans.com/jish

回味经典——uboot1.1.6 之 第二阶段 第三阶段

第一阶段:http://blog.csdn.net/lizuobin2/article/details/52054293 上篇文章说到,再清 BSS 段之后,CPU 跳转到 sdram 里的 start_armboot() 函数,本文,分析 uboot 流程的第二阶段.第三阶段. start_armboot函数在lib_arm/board.c中定义,是U-Boot第二阶段代码的入口.第二阶段的主要工作是进行单板级别的初始化,初始化 nandflash .norflash .初始化串口.设置环境变

转:AM335x启动流程(BootRom-&gt;MLO-&gt;Uboot)

http://blog.chinaunix.net/uid-28458801-id-3486399.html 参考文件: 1,AM335x ARM Cortex-A8 Microprocessors (MPUs) Technical Reference Manual.pdf: 2,am3359.pdf: 1,am335x的cpu上电后,会跳到哪个地址去执行? 答: 芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img AM335x 中bootloader被分成了 3 个

从底层理解Python的执行

摘要:是否想在Python解释器的内部晃悠一圈?是不是想实现一个Python代码执行的追踪器?没有基础?不要怕,这篇文章让你初窥Python底层的奥妙. [编者按]下面博文将带你创建一个字节码级别的追踪API以追踪Python的一些内部机制,比如类似YIELDVALUE.YIELDFROM操作码的实现,推式构造列表(List Comprehensions).生成器表达式(generator expressions)以及其他一些有趣Python的编译. 关于译者:赵斌, OneAPM工程师,常年使

嵌入式学习笔记102-uboot_1.1.6移植(2)

接下来分析uboot的第二阶段,在第一阶段的start.S的末尾有: ldr pc, _start_armboot _start_armboot: .word start_armboot 而start_armboot()就是第二阶段的入口,首先我们要认识两个重要的结构体,start_armboot()函数的一系列初始化可以说都是以这个结构体为主线的: typedef struct global_data { bd_t *bd; unsigned long flags; unsigned long

解释器

解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行.解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢.它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去. 中文名 外文名 Interpreter 分    类 电脑程序 1执行方式 Python.TCL和各种Shell程序一般而言是使用解释器执行的.微软公司的Qbasic语言也是解释

uboot中gd的定义和使用

最近在做uboot中nand启动相关的工作,遇到一个问题一直纠结着.现在终于明白了这个问题,想想还有好多兄弟在某个黑暗的角落里或者某台电脑前纠结着呢,所以赶紧写下来以供查阅. uboot version 2014.4 /* Architecture-specific global data */ struct arch_global_data { #if defined(CONFIG_FSL_ESDHC) u32 sdhc_clk; #endif #ifdef CONFIG_AT91FAMILY