问题标签 [jump-table]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 如何在 MASM 汇编语言中执行前向引用?
我想要做的是创建一个前向引用,其中我只在循环结束时跳回主循环(永远)。现在,我只知道如果我在每个无效、正、负标签的末尾写上 `jmp jumpToMainLoop' 就可以跳回主循环。如何调整程序以使其仅在循环结束时跳转到永远?
javascript - 通过函数名称查找表调用 javascript 函数(或方法)的最快方法是什么?
我正在用 JavaScript 模拟一个 8 位微处理器。我已将每个操作码函数名称存储在一个数组中,并调用与从我的虚拟内存读取的操作码相关的 256 个函数中的每一个,如下所示:
我最近更改了我的代码以摆脱 eval() 如下:
在 Mac Safari 中,以上两者之间没有明显的速度差异,这让我感到惊讶。我认为后者会更快,但我的虚拟时钟速度对于两者来说大致相同(目前峰值为 4MHz)。
由于与使用 eval() 相比,使用索引方法调用似乎没有速度损失,我希望也更新我的虚拟内存系统,但我对要使用的语法有一个心理障碍。
要写一个字节,我有:
我正在使用这种索引的间接方法,因此我可以将设备映射到地址范围并根据需要放置断点和观察点,这些断点和观察点都会拦截内存读取和写入 - 最大限度地提高性能。
关于如何在保持数据吞吐量的同时丢失 eval 的任何建议?
我想将外部方法映射到间接数组中,并且能够传递参数(要写入的值)。因此,无论哪个虚拟硬件使用公共接口访问虚拟内存,其他虚拟硬件都可以拦截该进程并在必要时监视或更改值。
flash - 在应用程序编程中开发STM32的策略
我正在寻找有关如何开发应用程序编程模块的想法。
我们用“C”语言为我们的安卓系统开发了一个 STM32F2xx 连接盒。本质上,这只是一个多设备到蓝牙信息的桥梁。现在我正在考虑如何提供一个“应用程序编程”模块,以便将来从蓝牙串口升级这个盒子,而不需要物理连接。
对我来说读或写闪存不是问题,但我需要了解处理器如何运行程序,如何将程序划分到不同的闪存位置以及如何跳转到闪存的具体地址。我在哪里可以搜索到这些信息?
compiler-construction - 导出C/C++ switch/case跳转表信息
在 x86-64 上的 C/C++ 中,如果 switch/case 语句相对较大(超过 3 或 4 个条目),则 LLVM 将生成跳转表,而不是条件跳转指令。
在 Clang/LLVM 中,如何导出这些表的基数、索引和比例信息?程序源代码可用。
例如,对于
jmpq *0x400000(,%rbx,8)
,
如何导出基数0x400000
、将与 in 值比较的索引值%rbx
和比例8
?
c - 函数指针或跳转表
在问这个问题之前,让我先提供一些背景:
我正在阅读有关Autosar的技术文章该体系结构为应用层软件组件提出了即插即用的方法。基本上这篇文章建议您可以将内存划分为单独的组件,并仅对那些已修改的组件而不是整个软件映像进行编程 /flash。这将在访问经销商期间节省一些重新编程时间。现在,由于正在重新编程的函数的地址可能会发生变化,当这些修改后的函数被位于另一个分区(内存部分)中的函数调用时,这将导致问题。文章通过使用位于固定地址并包含更新函数的地址的跳转/间接表来提出此方法的解决方案。
现在让我进入问题部分:
我不是从Autosar架构而是从嵌入式工程师的角度考虑这个问题,并认为虽然这种方法可行,但它会增加吞吐量。我认为可以使用的另一个选项可能是函数指针。但是后来我认为在正常情况下,链接器将函数符号名称替换为其实际地址,因此函数 A(位于未更改的分区)被初始化为函数 B(位于更新的分区和可能在不同的地址)将不起作用。
这终于把我带到了我的最后一个问题:
- 函数指针的方法会起作用吗?(我认为它可能不会。)
- 如果上述问题的答案是否定的,我是否仍然可以使用函数指针方法,例如将所有函数指针保持在固定地址并使用脚本和映射文件来修补实际地址。
我感谢所有耐心回答这么长的问题的人。我希望我能提出一个小问题。
c - 将 x86 汇编跳转表转换为 C
我有这个 x86 汇编代码,我正在尝试将其转换为 C:
我的问题是关于这jmp *operations(,%ecs,4)
条线的。我认为这是一个 switch 语句,我知道它在内存中是如何工作的,但它如何转换为 C 语言?我不是必须知道这些位置的堆栈上有什么才能为其编写开关吗?
这就是我所拥有的:
xcode - 创建常量跳转表;代码;铛; 汇编
尝试在我的 asm 程序中为 iphone (arm64) 创建跳转表时,我遇到了一个很奇怪的问题:
编译后,此表由零填充,而不是实际值。通过转储编译的目标文件可以看到。
如何解决?
interrupt - 中断向量表:为什么有些架构使用“跳转表”VS“指针数组”?
在某些架构(例如 x86)上,中断向量表(IVT)确实是它在锡上所说的:向量表,又名指针。每个向量保存一个中断服务程序(ISR) 的地址。当发生中断请求(IRQ) 时,CPU 会保存一些上下文并将向量加载到PC寄存器中,从而跳转到 ISR。到目前为止,一切都很好。
但在其他一些架构(例如 ARM)上,IVT 包含可执行代码,而不是指针。当 IRQ 发生时,CPU 会保存一些上下文并执行向量。但是这些“向量”之间没有空间,因此那里没有存储 ISR 的空间。因此,每个“向量指令”通常只是跳转到内存中其他地方的正确 ISR。
我的问题是:后一种方法的优点是什么?
如果 ISR 本身有固定的知名地址,并且被隔开以便合理的 IRS 就位,我会有点理解。然后我们将保存一个间接级别,尽管以一些碎片为代价。但是这种“紧凑的跳表”方式似乎一点优势都没有。我错过了什么 ?
assembly - 在 FPC ASM 中对齐跳转表操作
我有一个像这样的跳转表:
这在理解 jmp 代码长度为两个字节的情况下完美地工作。我随后将代码添加到 @@seg? 代码段,现在在跳转到“更远”的代码段(标签)时会导致崩溃。
我得出的结论是,较长的跳转被编码为大于 2 的长度。不幸的是,我使用的反汇编程序停在该jmp rax
行,所以我无法确认。但结论是合乎逻辑的。
有没有办法让编译器对齐jmp @@seg
?说 4 个字节的命令,以便我保证跳转表足够大和一致的大小?如果是这样,我可以确保rax
在 4 秒内增加。
我当然不想开始手动添加nop
' 来解决这个问题。
c - 汇编代码和 Switch 语句案例
我很难理解案例 50、52 等是如何通过汇编语言确定的。
据我了解,跳转表对应于每种情况下要执行的操作,并且检查 edx > 5 表示该情况的范围从 0 到 5?我相信 1 被遗漏了,因为它是默认情况,但为什么 5 被遗漏了?
我觉得应该有一个案例55:结果* =结果,不是吗?
如果有人能帮忙解释一下,那就太好了。谢谢!
图 3.38 显示了该过程的反汇编目标代码。我们只对第 4 行到第 16 行显示的代码部分感兴趣。我们可以在第 4 行看到参数 x(相对于 %ebp 的偏移量 8)被加载到寄存器 %eax 中,对应于程序变量结果。第 11 行的“lea 0x0(%esi), %esi”指令是插入的 nop 指令,以使第 12 行的指令从 16 的倍数的地址开始
跳转表位于不同的内存区域。使用调试器 GDB,我们可以使用命令 x/6w 0x8048468 检查从地址 0x8048468 开始的六个 4 字节内存字。GDB 打印以下内容:
汇编代码: