文档章节

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那样的虚拟指令解释器。



© 著作权归作者所有

共有 人打赏支持
下一篇: 网络留念
通九互联科技
粉丝 133
博文 38
码字总数 21941
作品 1
大连
个人站长
私信 提问
asm goto与JUMP_LABEL

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

晨曦之光
2012/04/10
395
0
Wayland and Weston 0.85.0 released

This is the first real release of Wayland and Weston. Wayland is the protocol and IPC mechanism while Weston is the reference compositor implementation. The 0.85 branch in both ......

杨英超
2012/02/13
5
0
PHP分页设计

一、分页类设计Page.php

dyzyxy
2015/05/08
0
0
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
3K
9
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.9K
14

没有更多内容

加载失败,请刷新页面

加载更多

【Visual Studio 扩展工具】使用 ComponentOne迷你图控件,进行可视化数据趋势分析

概述 迷你图 —— Sparklines是迷你的轻量级图表,有助于快速可视化数据。 它们是由数据可视化传奇人物Edward Tufte发明的,他将其描述为“数据密集,设计简单,字节大小的图形。”虽然迷你图...

葡萄城技术团队
11分钟前
2
0
java中重试的使用工具

spring-retry easy-retry guava-retry spring-retry中应该注意的东西 @EnableRetry Retryable注解 被注解的方法发生异常时会重试 value:指定发生的异常进行重试 include:和value一样,默认...

writeademo
23分钟前
2
0
NEO改进协议提案8(NEP-8)

文章目录 摘要 动机 原理 详述 CALL_I CALL_E CALL_ED CALL_ET CALL_EDT 向后兼容性 实现 摘要 本NEP提议NeoVM计算栈堆栈隔离,以确保动态调用的安全性,并为将来的新功能提供支持。 动机 现...

NEO-FANS
25分钟前
1
0
TiDB DevCon 2019 报名开启:年度最高规格的 TiDB 技术大会

年度最高规格的 TiDB 技术大会 海内外动态及成果的综合呈现 最新核心技术解读 多个成果首次亮相 2019 RoadMap 展望 14 位海内外基础架构领域技术大咖 8 个跨行业多场景的用户实战经验 1 小时...

TiDB
26分钟前
0
0
struts2返回json

返回action中成员变量jsonResult,注意设置get set方法 struts配置文件 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Co......

安卓工程师王恒
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部