问题标签 [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.

0 投票
1 回答
2437 浏览

assembly - x86 XOR 操作码差异

查看http://ref.x86asm.net/coder32.html我发现了两个与语句匹配的操作码

xor eax,eax

1)操作码 31 XOR r/m16/32 r16/32

2)操作码 33 XOR r16/32 r/m16/32

都指操作数 1 和操作数 2 的 32 位寄存器。那么,在异或两个 32 位寄存器的这种特定情况下有什么不同吗?

0 投票
1 回答
3904 浏览

assembly - 在 x86-64 中编码 JMP FAR 和 CALL FAR

我熟悉 r/m8、r/m16、imm16 等,但如何编码 m16:16、m16:32 和 m16:64?这些在 JMP 和 CALL 指令中......

m16:16 是地址位置吗?或者它就像一个直接地址?任何帮助将不胜感激!

0 投票
2 回答
1077 浏览

assembly - 为什么我的汇编器不使用 05 操作码 (add eax,imm32) 缩写形式的 ADD EAX,1 的手动文档,但它适用于 04 ADD AL,1?

我正在编写一个 x86-64 汇编程序。我正在查看 Intel x86 手册第 2 卷,试图了解如何从程序集中生成正确的指令。我主要了解它的工作原理,但一直在组装和拆卸说明以检查我是否正确。

在 ADD 参考表(第 2A 卷,第 3.31 节)中:

集合:

拆卸:

所以第一个是正确的,就像手册说的那样,但是汇编器使用像 REX 前缀这样的 ADD 参考表更下方的指令,为什么使用那些而不是我之前列出的那些?

现在是第二个ADD ax, 1;搜索后我发现这66是操作数大小覆盖前缀,但它没有在 ADD 参考表中列出,所以我什么时候选择添加这个前缀我似乎找不到太多关于它的信息或英特尔中的其他旧前缀手动的?

我尝试按照手册中的说明反汇编 05 01,但它没有将其识别为操作码,只是数字。英特尔手册是一个很好的资源,我认为它只是缺少一些额外的解释和结构,但我仍在试图围绕 ModRM 的东西。

0 投票
1 回答
1379 浏览

assembly - MIPS指令解码

我试图了解如何解码 MIPS 二进制指令。

我使用 gcc 在 Debian MIPS 系统上用 C 语言编译了一个 hello world 程序,objdump 显示 .text 部分中的第一条指令是:

600: 03e00025 move zero,ra

我不明白它如何确定这是MOVE指令。

03e0002500000011111000000000000000100101二进制的。如果我理解正确,这里的前 6 位是操作码,在这种情况下全为 0,这意味着它是 R 型指令,所以我们必须查看最后 6 位,即100101. 查看MIPS 指令集手册,它看起来应该是OR指令。MOVE我什至在那个手册里都找不到。

对此进行谷歌搜索,我发现程序集中显然有“伪”指令,并且应该move $t, $s扩展为addiu $t, $s, 0,但如果我查看手册ADDIU有 opcode 001001。我发现的另一个结果声称它转换为ADD但最后六位ADD应该是100000,所以这也不适合。

我错过了什么?

0 投票
1 回答
1600 浏览

assembly - x86 汇编 16 位与 8 位立即操作数编码

我正在编写自己的汇编程序并尝试对 ADC 指令进行编码,我对立即值有疑问,尤其是在将 8 位值添加到 AX 寄存器时。

添加 16 位值时:adc ax, 0xff33被编码为15 33 ff正确的。但是如果adc ax, 0x33被编码为有关系15 33 00吗?

Nasm 将83 d0 33其编码为显然是正确的,但我的方法也正确吗?

0 投票
1 回答
723 浏览

assembly - x86 在执行指令和读/写数据时如何处理字节寻址和字寻址?

所以我正在学习 x86 是如何工作的,并且遇到过人们说它是字节可寻址的,但可以读取字、双字等。处理器如何决定使用哪种方法以及何时使用?例如,访问下一条指令以及当用户想要读/写内存时,使用哪种寻址模式?

0 投票
2 回答
292 浏览

assembly - 为什么 JALR 对偏移量的 LSB 进行编码?

我们知道它jal指定了一个 21 位的偏移量。但是,它不编码 21 位偏移量,而是 20 位偏移量。原因是地址的最低有效位始终为零,因为可能的最小 RISC-V 指令为 2 个字节,因此该位未在指令中编码。

通过以这种方式对偏移进行编码,它可以提供 ±1MiB 的跳跃范围。如果jal确实对 LSB 进行编码,它将仅提供 ±512KiB 的跳跃范围。

但是,jalr指定 12 位偏移量的指令确实对 LSB 进行了编码。这会将跳跃范围减小到 ±2kiB(而不是 ±4kiB)。我知道它jalr使用 I 型格式,与addi这种指令的立即数的 LSB 相同,并且必须对这种指令进行编码。但是,我看不出为什么必须对最低有效位进行编码jalr

0 投票
1 回答
762 浏览

assembly - 为什么在 64 模式下默认操作数大小为 32 位?

我正在阅读英特尔文档,第一卷。1 并且有3.6.1 64-Bit Mode 中的操作数大小和地址大小一章。有三个前缀REX.W,操作数大小66和地址大小67前缀。并且提到操作数默认为 32 位大小。并且只能使用REX.W指令前缀(在其他前缀之后)更改它以使其长度为 64 位。

我不知道为什么,为什么我不能将完整的 64 位空间用于int操作数?跟标志有关系吗?或者为什么会有这个限制?(所以,C是否在 int 上unsigned int使用REX.W前缀和操作(正如也提到的,前缀仅持续用于特定指令,但不适用于整个段,这应该是(大小,地址或操作数的)默认值和包含在段描述符中)。

我理解正确吗?

0 投票
1 回答
213 浏览

assembly - 理解这个简单的 movl 操作码

我开始学习阅读操作码,我发现了这个:

var_6ch在哪里ebp-0x6c

哪个部分89 75 95表示“地址” ebp-0x6c?我在互联网上找到89了 movl 的代码,也许 75 是用于注册 esi?或者也许 2 个字节编码这 2 个信息。

我在哪里可以找到更多相关信息并快速搜索这些内容?

0 投票
2 回答
181 浏览

assembly - 当我们只知道操作码的十六进制时如何编码指令

这个来源中,他们给出了 cmp r/m16/32 imm8 的十六进制是 0x837。在某处我得到了,ebp 的十六进制是 0b0101。有了这些信息,我如何对指令进行编码cmp dword [ebp-4] 2?我已经搜索了几个小时,除了这条(第 61 页)cmpb $0xf,(%rdi)编码为 80 3f 0f 的类似指令外,没有任何线索。但我无法理解这一点,因为我提到的前一个消息来源说 0x803 是给 sbb 的。rdi 也是 0b0111 而不是 0b1111 (确实是 r15)。我很困惑......如果可能的话,我想要 x86-32 和 x86-64 的编码指令。