问题标签 [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 指令的长度?
我正在查看汇编中的不同指令,我对如何确定不同操作数和操作码的长度感到困惑。
这是您应该从经验中了解的内容,还是有办法找出哪个操作数/运算符组合占用了多少字节?
例如:
所以问题是:
看到给定指令后,我如何推断其操作码需要多少字节?
x86 - x86 找出指令的操作数大小仅给出十六进制机器代码?
例如,给定一个十六进制: 83 E4 F0
通过查看英特尔开发人员手册,我可以弄清楚这83
意味着. 看着,我可以解码源/目标寄存器是 SP 或 ESP。and
FO
-16
E4
因此,我可以得出结论,十六进制表示要么and $-16, %ESP
要么and $-16, %SP
。但是,在手册中,这两者都被列为83 /4 ib
.
我怎样才能区分这两者?
assembly - 如何根据实模式偏移和寻址确定 x86 机器操作码值?
我正在尝试将原始机器代码字节作为 0 和 1 写入文本文件,并通过 BIOS 执行它。
然而,我在理解寻址、乘法、偏移、寻址、操作数和指令如何在组合排列中工作时遇到了一些问题,即MOV AL, 07
和之间的区别MOV BL, AL
。
我的意思是它在汇编中是有意义的,但在机器代码中,很难理解参数的概念。
所以我想知道的是:我怎样才能更好地理解这一点?我发现没有教程可以准确地解释/描述数据传递、MMIO、寻址模式、算术等之间的组合相关性或连接中的指令中的 0 和 1。
在这个网站http://ref.x86asm.net/coder32.html#x00它尝试,但我不明白这一点。
示例:假设我想将 5 移入 AL ... 我是否将二进制中的文字“5”指定为与 AL/MOV 指令链接的二进制前缀中的操作码的一部分,或者我是否将为每个二进制代码指定一个固定的二进制代码指令,不管价值?这就是我想知道的......如何理解机器代码是如何编写的。
assembly - ASM 空间优化:EAX 与 EBX
我正在研究一个 x86 汇编代码高尔夫拼图。我正在使用 NASM 组装源文件:
使用-O0
,应关闭所有优化。目标是减小 ELF 二进制文件的大小。
在为这个谜题开发“参考实现”时,我偶然发现了一个奇怪的行为。这是一个简化的代码示例:
二进制是 264 字节:
现在,当我简单地将部分eax
中的所有出现替换为,或时,二进制文件会变大:read_stdin
ebx
ecx
edx
在比较目标文件的大小时,差异更大(480 对 496 字节)。发生这种情况的寄存器有什么特别之处eax
?NASM 是否在进行某种优化,即使-O0
已指定?
assembly - 被 x86 MOV 指令迷惑
从 Intel64 和 IA-32 手册第 2a 卷中,有许多可能的指令用法mov
。如:
我编写了代码来测试(gas,intel 语法):
在组装、链接和 objdump 之后,我得到了相关的组装:
显然,我写的第二条指令不是预期的手动指令。手册中的格式说明是什么?
assembly - ARM指令到十六进制负载,如pc相对LDR
我一直在尝试将 arm 指令转换为包括 PC 寄存器的十六进制,例如
我查了《ARM架构参考手册》,LDR指令的描述如下:
问题出现了, 1. cond 值,见指令格式,LDR 指令对应的cond 值是0101(PLUS) 还是?2、Rd为PC寄存器,如何用四位来描述PC[15:12]
assembly - 00 的汇编 x86 机器码含义
我想知道机器代码00是什么意思?另外,我有时会在程序中看到机器码 08。08 是什么意思?
assembly - 为什么x86-64的jmpq只需要32位长度的地址?
当我objdump -D
用来反汇编二进制文件时,典型的代码jmpq
是 like e9 7f fe ff ff
,用于表示负偏移量。但是,x86-64 的地址是 64(48)位(据我所知),那么这个 32 位地址如何7f fe ff ff
代表 64 位绝对地址的负偏移量呢?
此外,是否有任何其他指令,例如jmp
and jmpq
,但具有 64 位地址位移?如何在 Intel 或 AMD 的手册中找到说明(我搜索过jmpq
但一无所获)?
当我搜索时,它似乎被称为 RIP 相对寻址。似乎并非所有指令都这样做。是否有 64 位相对寻址?如果是间接跳转,那么 64 位绝对地址应该在寄存器或内存中,对吧?
assembly - 什么是 8086 ESC 指令操作码
主要是历史兴趣,如果我要为汇编程序实现 8086 兼容性,哪些操作数被认为对ESC
指令有效?
ESC opcode, source
从 8086 Programmer's manual 我知道,这opcode
是 0 到 63 范围内的立即数,source
是寄存器或内存。但是可以对哪些寄存器进行编码?两者兼有reg8
或reg16
仅reg16
?如果source
是内存,操作数大小(mem8
或mem16
)重要吗?
基本上,从指令编码的角度来看,上述两者都无关紧要(例如,两者esc 0x01, ch
都会esc 0x01, bp
产生相同的结果),但也许汇编程序有强制限制
最后,我在哪里可以找到ESC
操作码的描述?
assembly - 为什么 MIPS 没有像 Load Immediate 指令一样的 Store Immediate 指令?
MIPS 有一个 Load Immediate ( LI
) 伪指令,用于将 32 位立即数加载到寄存器中。但它没有 Store Immediate ( SI
) 指令来将 32 位立即数存储到内存中。有人可以解释我为什么吗?