问题标签 [instruction-encoding]
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 - 下面给出的关于不使用前缀 66/F2/F3 的 2 组指令有什么区别?
英特尔文件第 2 卷第 3 章的第 3.1.1.1 节对NP进行了以下说明:
NP — 表示指令不允许使用 66/F2/F3 前缀(超出指令操作码的部分)。此类使用将导致无效操作码异常 (#UD) 或导致不同指令的编码。
在查看手册中的一些说明后,我发现:
- 这些是在其编码中包含NP的指令的几个示例:ADDPS、ANDPS、ANDNPS、BNDLDX、BNDSTX。还有许多其他人在其编码中具有相同的NP 。
- 这些是在其编码中没有前缀 66/F2/F3 的指令示例:ADD、AAD、AAM、AAS 和 ADC。但是他们没有在它的 encodings 中显示NP。
这两组指令与不使用前缀 66/F2/F3 有什么区别?换句话说,第 1 组中 NP 的存在如何将这些指令与第 2 组中的指令区分开来?
assembly - ARM 汇编:需要帮助计算 BL 操作码的跳转偏移量
我正在研究破解游戏以允许隆隆声。这需要将现有 rom 中的一行代码替换为我想调用的新函数的 bl,但是我很难计算必要的偏移量。
我要替换的函数位于地址:0x080011b0
我希望跳转到的位置是地址:0x0817d7c0
我还获得了以下示例:
我相当肯定游戏是 16 位的,但是我什至无法重现示例的结果,更不用说产生我自己的跳跃偏移了。我相信这些值是用 little-endian 编码的,但我已经尝试过大运气和小运气(我可能在这里做错了)。具体来说,当我执行按位运算(& 和 |)时,计算开始中断。
如果有人可以引导我完成示例以生成提供的偏移量,或者可以计算我需要的偏移量并引导我完成它,我将非常感激。如果您能告诉我如何在 32 位 ARM 模式下执行此操作,则可以加分。
assembly - 指令编码?
我的教授想向我们展示如何解码指令,他举了一个例子(at&t 语法):
我对他为什么选择操作码为 C7 感到迷茫。
从我发现的在线表格中:
他是如何知道它的符号扩展的,以及为什么我们要移动 32 毫米?指示很清楚movq
不是movl
assembly - 汇编,将 64 位立即移至内存?
我在读:
在其中一个答案中提到:
mov reg64, imm(intel 语法,目标优先)是唯一接受 64 位立即数作为参数的指令。这就是为什么您不能将 64 位立即数直接写入内存的原因。
这不是很明显的矛盾吗?一方面,他说这条指令接受 64 位立即数。另一方面,他说这就是为什么你不能使用 64 位立即数的原因!
我完全迷失了,为什么关系是“这就是为什么”这显然是矛盾的,他证明了为什么我们可以将 64 位立即数移动到内存中?
assembly - 如何确定 MIPS 指令的 rs、rd 和 rt 的值?
例如 addi $t1, $t2, 20 的 rs 字段的值为 01010。这是为什么呢?
assembly - ARM 程序集中的立即值编码
我现在正在学习汇编语言,我对立即值的编码方式有点困惑。有人可以解释为什么以下值有效:0xff00ff00、0xffffffff、0x007f8000?另外为什么值 0xff0000ff, 0x007f9000 无效?
据我了解,12 位立即数分为 4 个高位旋转和 8 个低位常量。所以我认为我上面列出的所有值都是无效的,因为它需要超过 12 位。
关于这个主题的一些澄清会很有帮助,谢谢!
x86 - x86 jmp 如何知道指令在哪里结束?
考虑到 x86 指令集包含变长指令,jmp 是如何知道指令在哪里结束的呢?例如
系统如何知道“0”将引用长度为2的指令,即01 c0,而不是长度为4的指令,即“01 c0 e9 fc”?
assembly - ModRM:不能使用直接地址,汇编 x86
我不明白为什么我收到一条非法指令,其中一段代码在 C 程序中作为汇编实现。我稍微解释一下。
我在特定地址有一个值,我想将该值移动到 EAX x86 寄存器中,例如
在 C 代码中,我有指向该地址的指针。我以这种方式准备了这条指令的二进制代码:
地址不在寄存器中,我想将内存数据移动到 EAX 寄存器。我有内存位置的值,所以:
通过这种方式,我获得了非法指令,但我不明白为什么。如果我使用 R/M = 101 我得到 0x8b 0x05 [byte3] [byte2] [byte1] [byte0] 0xc3 并且一切正常。
那么,问题出在哪里?有人可以从这张表中解释 MOD=00, R/M=110 的用法吗?直接???
MOD=00, R/M=101 有效,但在表中我看到从 DI 计算的内存位置,但我有一个直接的内存位置......
注意:使用 -m32 gcc 开关在 Ubuntu 20.04(64 位)上编译的代码
assembly - ARM Assembly 中的偏移量是从开始还是结束计算?
我对 ARM 程序集非常陌生,我想了解当您使用STUR
. 举个例子,这里是 64 位
现在当我打电话
STUR X0, [X29,#var_8] ; Store the value of X0 (0xB) into the stack at offset 0x8
会变成吗?
或者
assembly - 当由 x86 CPU 解释时,更多的字节序列是否有效?
这似乎是一个奇怪的问题,但我认为它与某些 x86 二进制分析障碍有关。我正在思考这个想法:如果我有一个二进制文件可以连接到远程服务器以获得跳转目标,但服务器要到 12 月才会告诉我目标,我想在 11 月分析程序的行为,我可以开始跳转到程序中的随机地址并可靠地猜出一些正确的指令偏移量?我是否有可能“闯入”程序的控制流结构并“绕过”那个秘密跳转目的地的问题?
安全研究员 Chris Domas演示了一个他称为 Sand Sifter 的程序,该程序试图模糊 x86 指令:https ://github.com/xoreaxeaxeax/sandsifter
我在想如果无效指令很常见,换句话说,如果跳到指令中间经常会导致很快遇到无效指令,我们能找到正确的偏移量吗?
好吧,这可能太模糊而不能成为一个有效的问题,所以我决定简化它:粗略地说,我们是否对所有字节序列的哪一部分是有效指令有任何估计?我想另一种问法可能是:如果我生成了 100 万个随机熵二进制序列,其中有多少百分比会有有效的执行路径?甚至这个问题也因二进制文件的长度而变得复杂,因为二进制文件越长,最终就越有可能遇到无效指令。