问题标签 [opcodes]

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.

0 投票
1 回答
845 浏览

php - 按引用分配错误

前几天我遇到了这个看似非常简单的问题如何在不引用 $array1 的情况下更改 $array2 中的值?然而,我对它的研究越多,它似乎就越奇怪,这确实按预期运行。在此之后,我开始研究从以下输出生成的操作码。

这对我来说似乎很疯狂,因为 array2 应该只是 array1 的副本,并且一个数组发生的任何事情都不应该影响另一个数组的内容。当然,如果您注释掉第二行,最后一行将像预期的那样回显 10。

看得更远,我可以看到一个很酷的网站,它向我展示了 PHP 使用 Vulcan Logic Dumper 生成的操作码。这是上述代码生成的操作码。

这些操作码在这里没有很好地记录http://php.net/manual/en/internals2.opcodes.php但我相信在英语中操作码正在执行以下操作。按行...可能对我来说比其他任何人都重要。

  1. 第 3 行:我们用它的第一个值初始化数组,然后在将它分配给 $array1 之前给它加 10。
  2. 第 4 行:获取只写?数组中的值并通过引用 $x 来分配它。
  3. 第 5 行:将 $array1 设置为 $array2。
  4. 第 6 行:获取 1 的数组索引。我猜 od_data 将其设置为 22,尽管 $6 从未返回。OD_DATA 绝对没有文档,并且在我看过的任何地方都没有列为操作码。
  5. 第 8 行:从 $array1 的索引 1 中获取一个只读值并将其回显。

即使通过操作码工作,我也不确定这是哪里出错了。我有一种感觉,缺乏关于操作码的文档,而且我没有使用它们的经验,这可能使我无法弄清楚哪里出了问题。

编辑1:

正如 Mike 在第一个评论数组中指出的那样,复制数组时会保留引用状态。这里可以看到文档以及它链接到http://php.net/manual/en/language.types.array.php#104064的数组文章中的一个位置。这很有趣,不被视为警告。如果这是真的,那么令我惊讶的是,没有像您期望的那样保留此代码的参考状态。

因此,似乎只有当您尝试通过引用分配单个元素时才会发生这种情况,从而使此功能更加混乱。

为什么php只在单独分配数组索引时保留它们的状态?

编辑2:

我今天使用 HHVM 进行了一些测试,HHVM 以您认为的方式处理了第一个代码片段。我喜欢 PHP,但 HHVM 比 Zend 引擎看起来越来越好。

0 投票
2 回答
317 浏览

python - Cython:使用 globals().update(...)?

我正在为以前具有 Cython 工具链的模块编写 Python 字节码优化器。虽然现在可能已弃用,但我在摆弄它时遇到了一些奇怪的事情。考虑这段简单的代码:

这应该打印 97,正如其操作码(即 97)STORE_GLOBAL所定义的那样。opmap不过,Cython 会告诉我这STORE_GLOBAL没有定义:

原因很简单,我猜。我假设它不会更新全局变量,所以它不知道STORE_GLOBAL现在是一个变量。

有没有一种简单的方法来克服这个问题?

干杯

0 投票
1 回答
3022 浏览

arm - 如何判断一个字(4 字节)是 16 位指令还是 32 位指令?

如何知道字中的字节代表 16 位指令还是 32 位指令?
我提到了 ARM ARMv7M,但我不清楚如何区分它是 16 位指令还是 32 位指令。
它说
If bits [15:11] of the halfword being decoded take any of the following values, the halfword is the first halfword of a 32-bit instruction:
• 0b11101 • 0b11110 • 0b11111. Otherwise, the halfword is a 16-bit instruction

这是否意味着处理器总是获取半字,检查它们并决定它是 16 位还是 32 位?
第一个半字是什么意思?位[31-16] 或位[15-0] 一个字?

如果我有 32 位,那么我可以知道它是 32 位指令还是 16 位指令?

谢谢。

0 投票
1 回答
196 浏览

assembly - 这种转变/跳跃会比 switch...case 语句更快吗?

我正在尝试最大程度地优化一个分支(类似 switch...case),以在 x86 CPU 上模拟 X CPU。我想到了这一点:在内存中,我将加载固定长度为 0x100 字节的 x86 操作码块,如下所示:

这将是有限的,从内存 $0(+ 可能是一些偏移量)开始并以 $0xFFFF 结束(如 0x10000 大小的“rom”)。现在,每次获取和模拟 X CPU 操作码时,我都会这样做:将其左移 8 位并跳转到该位置。执行此操作,并正常继续我的程序流程。我的问题是:1)这些操作码块是否可能如此紧密?2)这是过去的普遍做法吗?

0 投票
2 回答
1411 浏览

java - 为什么 JVM 有 iconst_2 - iconst_5 操作码?

在阅读 JVM 规范时(就像一个人一样),当我遇到 7 个iconst_<i>操作码时,我感到非常惊讶。毕竟,只有一个字节可以玩。

我很少在我的代码中写 2、3、4 或 5 的字面量。我可以理解为什么 -1、0 和 1 可能会被特殊对待,但让我感到惊讶的是,设计师想要在恰好很小的数字上吹出 4 个宝贵的操作码。

有谁知道这是否有充分的理由?我是否低估了这些好处?

0 投票
0 回答
1002 浏览

assembly - X86_64 程序集中的调用过程

我正在编写一个跟踪另一个程序并列出函数调用(近调用、远调用、动态链接等)的小程序。

由于 dotty 框架,我们的目标是生成一个调用图。

我目前正在努力解码 ptrace(PEEK_TEXT) 给出的操作码。

我已阅读英特尔官方文档http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-instruction-set-reference -manual-325383.html )

以及其他十几本手册。

有几点我没有得到:

1)当我在 ptrace(PEEK_TEXT) 给出的单词中搜索 0xE8 操作码时,我发现了很多项目,我相信太多了。例如“objdump -d | grep call”给我:

所以我的程序应该列出相同数量的调用?正确的 ?但是相反,我找到了数百个电话……我找到了正确的电话,上面列出的电话也有其他电话。所以我在想,那些实际上不是值 0xE8 的前缀?他们是吗?如果是这种情况,我如何区分操作码 0xE8 和值为 0xE8 的前缀?

2)当操作码0xE8之后的偏移量为负时,我发现的唯一解决方案是使用0xff来memset一个缓冲区,然后复制其中以强制位符号为1。还有另一种方法吗?

3)有人可以再解释一次Mod R / M以及如何解码它?

4) 另外,如何解释值为 0x41 的 Rex 前缀?我如何知道 0x41 0xE8 是否是带有前缀的调用,而不是带有随机值的另一个操作码?

抱歉,如果我不清楚,这些主题很有趣,但我有点迷失在那里

0 投票
2 回答
112 浏览

arrays - SIGSEGV 在 ARMv6 上从数组执行机器代码

我正在尝试在 ArchLinux 下的第一个 Raspberry Pi 上执行存储在数组中的机器代码。我已经在 x86 下完成了它,但是在 ARMv6 下我无法理解我做错了什么。问题是数组中的代码无关紧要,执行第一条指令后它总是会崩溃。在 gcc 5.2.0 下禁用 Thumb interworking 编译代码。

这是我用于测试的代码:

机器代码取自shellcode2函数反汇编,我不知道这样做是否正确,但问题是即使 shellcode 中的第一条指令是 nop - 它也会崩溃。

我错过了什么或者只是在 ARMv6 上做错了吗?如果有人能指出我正确的方向,我将不胜感激。

提前致谢。

0 投票
1 回答
64 浏览

actionscript-3 - as3commons 在运行时生成函数调用

出于某种原因,我在运行时生成了一个类,该类具有一个带有受保护成员的现有超类并实现了一个现有接口。接口的每个方法(和访问器)也需要生成。我苦苦挣扎的一点是用正确的操作码填充方法体。这是我要生成或转换为操作码的示例:

所有信息都可用,例如函数名称、参数、返回类型和命名空间。而且我能够创建函数本身并返回一个默认值,就像在as3commons 测试/示例中看到的那样

也许我应该使用除 as3commons 之外的另一个库?

0 投票
3 回答
933 浏览

c++ - 函数指针数组 C++ 性能的查找表

我有以下代码来模拟我的电脑(x86)上的基本系统:

我将这个“表”称为“表”,opcodes[opcode]() 因为我正在尝试提高我的口译员的性能。内联每个函数怎么样,比如

这样做有什么好处吗?

反正有没有让它跑得更快?谢谢

0 投票
1 回答
842 浏览

emulation - 操作码 0xE9 (JP HL) 和 0xF8 (LD HL,SP+r8) 有什么作用?

我想我正在努力正确定义以下模棱两可的操作码:LD HL,SP+r8JP (HL)操作码(0xE90xF8分别)

在我的实现中,LD HL,SP+r8设置HL为 的值SP+r8,但我感觉这可能与从 RAM 加载内存有关。 JP (HL),我PUSH将 PC 放入堆栈并将程序计数器设置为 HL 的值(如JP a16,除了 HL 的值),但我读过一些论坛似乎说这是错误的。

对这些说明中的任何一个所做的任何澄清都会很棒,因为我现在很迷茫。