文档章节

Jump Table

通九互联科技
 通九互联科技
发布于 2015/02/19 11:12
字数 332
阅读 362
收藏 7

在阅读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);
 goto *opcodes[0];
 printf("Never seen this \r\n");
 free(opcodes);
 return 0;
lb_catch_end_y:
 printf("After goto \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那样的虚拟指令解释器。



© 著作权归作者所有

共有 人打赏支持
通九互联科技
粉丝 130
博文 38
码字总数 21941
作品 1
大连
个人站长
asm goto与JUMP_LABEL

越来越多的工作现如今都交给了编译器,甚至连动态代码修改的数据组织这种事都交给了编译器。gcc提供了一个特性用于嵌入式汇编,那就是asm goto,其实这个特性没有什么神秘之处,就是在嵌入式...

晨曦之光
2012/04/10
310
0
PHP分页设计

一、分页类设计Page.php

dyzyxy
2015/05/08
0
0
Semantic UI 2.1.5 发布,前端界面开发框架

Semantic UI 2.1.5 发布,此版本更新内容如下: 文档更新 Examples - All code examples now have a "copy to clipboard" button Thanks @xiwc and @zenorocha for clipboard.js 小改进 Form......

oschina
2015/11/02
2.8K
14
phpPgAdmin 5.0-beta1 发布

phpPgAdmin是一个基于web的PostgreSQL数据库管理工具。 下载地址:http://phppgadmin.sourceforge.net/?page=download 详细改进内容: Support for PostgreSQL 8.4 and 9.0 Support for dat......

红薯
2010/09/20
304
0
Nginx+Lua开发入门

第二章 Nginx+Lua开发入门 博客分类: 跟我学Nginx+Lua开发 nginxluangxluaopenresty Nginx入门 本文目的是学习Nginx+Lua开发,对于Nginx基本知识可以参考如下文章: nginx启动、关闭、重启 ...

fdhay
2016/08/31
38
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
30分钟前
0
0
java大数据转换16进制转10进制

public static void main(String[] args) {String hex = "0xdbf3accc683297cf0000";BigInteger amount = new BigInteger(hex.substring(2), 16);System.out.println(amount);......

任梁荣
昨天
1
0
OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @真Skr小机灵鬼儿:8.13分享Jocelyn Pook/Russian Red的单曲《Loving Strangers》 《Loving Strangers》- Jocelyn Pook/Russian Red 手机党少...

小小编辑
昨天
9
3
TypeScript基础入门 - 函数 - 剩余参数

转载 TypeScript基础入门 - 函数 - 剩余参数 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.1 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
昨天
1
0
OpenCV边缘检测算子原理总结及实现

1. 拉普拉斯算子 原理:是一种基于图像导数运算的高通线性滤波器。它通过二阶导数来度量图像函数的曲率。 拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维图像函数的拉...

漫步当下
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部