文档章节

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
iView 2.3.0 发布,基于 Vue.js 的企业级 UI 组件库

iView 2.3.0 发布了,iView 是一套基于 Vue.js 的企业级 UI 组件库,主要服务于 PC 界面的中后台产品。 Switch 新增 true-value 和 false-value 属性。#1399 Input 新增 autocomplete 属性。...

aresn
2017/09/05
2.8K
9
Nginx+Lua开发入门

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

fdhay
2016/08/31
38
0

没有更多内容

加载失败,请刷新页面

加载更多

992. Sort Array By Parity II - LeetCode

Question 992. Sort Array By Parity II Solution 题目大意:给一个int数组,一半是奇数一半是偶数,分别对偶数数和奇数数排序并要求这个数本身是偶数要放在偶数位上 思路:把奇数数和偶数数...

yysue
18分钟前
1
0
Snackbar源码分析

目录介绍 1.最简单创造方法 1.1 Snackbar作用 1.2 最简单的创建 1.3 Snackbar消失的几种方式 2.源码分析 2.1 Snackbar的make方法源码分析 2.2 对Snackbar属性进行设置 2.3 Snackbar的show显示...

潇湘剑雨
50分钟前
1
0
分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业数据存储

分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业数据存储 摘要: 原创出处 http://www.iocoder.cn/Elastic-Job/job-storage/ 本文基于 Elastic-Job V2.1.5 版本分享 1. 概述 本文主要分享...

DemonsI
56分钟前
1
0
jmockit demo

1、@Mocked,标识一个指定的class的实例或被测对象的参数被Mock掉。 2、@Capturing,标识一个被Mock的对象,从该对象派生的子类也被Mock了。 3、@Injectable,标识只有一个指定的被测对象的内...

我的老腰啊
今天
1
0
内容换行

用 <textarea>13611112222 这里想换行 13877779999</textarea><textarea>13611112222 13877779999</textarea>...

小黄狗
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部