问题标签 [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 - 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 位寄存器的这种特定情况下有什么不同吗?
assembly - 在 x86-64 中编码 JMP FAR 和 CALL FAR
我熟悉 r/m8、r/m16、imm16 等,但如何编码 m16:16、m16:32 和 m16:64?这些在 JMP 和 CALL 指令中......
m16:16 是地址位置吗?或者它就像一个直接地址?任何帮助将不胜感激!
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 的东西。
assembly - MIPS指令解码
我试图了解如何解码 MIPS 二进制指令。
我使用 gcc 在 Debian MIPS 系统上用 C 语言编译了一个 hello world 程序,objdump 显示 .text 部分中的第一条指令是:
600: 03e00025 move zero,ra
我不明白它如何确定这是MOVE
指令。
03e00025
是00000011111000000000000000100101
二进制的。如果我理解正确,这里的前 6 位是操作码,在这种情况下全为 0,这意味着它是 R 型指令,所以我们必须查看最后 6 位,即100101
. 查看MIPS 指令集手册,它看起来应该是OR
指令。MOVE
我什至在那个手册里都找不到。
对此进行谷歌搜索,我发现程序集中显然有“伪”指令,并且应该move $t, $s
扩展为addiu $t, $s, 0
,但如果我查看手册ADDIU
有 opcode 001001
。我发现的另一个结果声称它转换为ADD
但最后六位ADD
应该是100000
,所以这也不适合。
我错过了什么?
assembly - x86 汇编 16 位与 8 位立即操作数编码
我正在编写自己的汇编程序并尝试对 ADC 指令进行编码,我对立即值有疑问,尤其是在将 8 位值添加到 AX 寄存器时。
添加 16 位值时:adc ax, 0xff33
被编码为15 33 ff
正确的。但是如果adc ax, 0x33
被编码为有关系15 33 00
吗?
Nasm 将83 d0 33
其编码为显然是正确的,但我的方法也正确吗?
assembly - x86 在执行指令和读/写数据时如何处理字节寻址和字寻址?
所以我正在学习 x86 是如何工作的,并且遇到过人们说它是字节可寻址的,但可以读取字、双字等。处理器如何决定使用哪种方法以及何时使用?例如,访问下一条指令以及当用户想要读/写内存时,使用哪种寻址模式?
assembly - 为什么 JALR 对偏移量的 LSB 进行编码?
我们知道它jal
指定了一个 21 位的偏移量。但是,它不编码 21 位偏移量,而是 20 位偏移量。原因是地址的最低有效位始终为零,因为可能的最小 RISC-V 指令为 2 个字节,因此该位未在指令中编码。
通过以这种方式对偏移进行编码,它可以提供 ±1MiB 的跳跃范围。如果jal
确实对 LSB 进行编码,它将仅提供 ±512KiB 的跳跃范围。
但是,jalr
指定 12 位偏移量的指令确实对 LSB 进行了编码。这会将跳跃范围减小到 ±2kiB(而不是 ±4kiB)。我知道它jalr
使用 I 型格式,与addi
这种指令的立即数的 LSB 相同,并且必须对这种指令进行编码。但是,我看不出为什么必须对最低有效位进行编码jalr
。
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
前缀和操作(正如也提到的,前缀仅持续用于特定指令,但不适用于整个段,这应该是(大小,地址或操作数的)默认值和包含在段描述符中)。
我理解正确吗?
assembly - 理解这个简单的 movl 操作码
我开始学习阅读操作码,我发现了这个:
var_6ch
在哪里ebp-0x6c
哪个部分89 75 95
表示“地址” ebp-0x6c
?我在互联网上找到89
了 movl 的代码,也许 75 是用于注册 esi?或者也许 2 个字节编码这 2 个信息。
我在哪里可以找到更多相关信息并快速搜索这些内容?