问题标签 [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 投票
6 回答
7455 浏览

assembly - 如何判断 x86 指令的长度?

我正在查看汇编中的不同指令,我对如何确定不同操作数和操作码的长度感到困惑。

这是您应该从经验中了解的内容,还是有办法找出哪个操作数/运算符组合占用了多少字节?

例如:

所以问题是:

看到给定指令后,我如何推断其操作码需要多少字节?

0 投票
2 回答
1800 浏览

x86 - x86 找出指令的操作数大小仅给出十六进制机器代码?

例如,给定一个十六进制: 83 E4 F0

通过查看英特尔开发人员手册,我可以弄清楚这83意味着. 看着,我可以解码源/目标寄存器是 SP 或 ESP。andFO-16E4

因此,我可以得出结论,十六进制表示要么and $-16, %ESP要么and $-16, %SP。但是,在手册中,这两者都被列为83 /4 ib.

我怎样才能区分这两者?

0 投票
2 回答
3970 浏览

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 指令链接的二进制前缀中的操作码的一部分,或者我是否将为每个二进制代码指定一个固定的二进制代码指令,不管价值?这就是我想知道的......如何理解机器代码是如何编写的。

0 投票
1 回答
942 浏览

assembly - ASM 空间优化:EAX 与 EBX

我正在研究一个 x86 汇编代码高尔夫拼图。我正在使用 NASM 组装源文件:

使用-O0,应关闭所有优化。目标是减小 ELF 二进制文件的大小。

在为这个谜题开发“参考实现”时,我偶然发现了一个奇怪的行为。这是一个简化的代码示例:

二进制是 264 字节:

现在,当我简单地将部分eax中的所有出现替换为,或时,二进制文件会变大:read_stdinebxecxedx

在比较目标文件的大小时,差异更大(480 对 496 字节)。发生这种情况的寄存器有什么特别之处eax?NASM 是否在进行某种优化,即使-O0已指定?

0 投票
1 回答
1226 浏览

assembly - 被 x86 MOV 指令迷惑

从 Intel64 和 IA-32 手册第 2a 卷中,有许多可能的指令用法mov。如:

我编写了代码来测试(gas,intel 语法):

在组装、链接和 objdump 之后,我得到了相关的组装:

显然,我写的第二条指令不是预期的手动指令。手册中的格式说明是什么?

0 投票
1 回答
2883 浏览

assembly - ARM指令到十六进制负载,如pc相对LDR

我一直在尝试将 arm 指令转换为包括 PC 寄存器的十六进制,例如

我查了《ARM架构参考手册》,LDR指令的描述如下: 在此处输入图像描述

问题出现了, 1. cond 值,见指令格式,LDR 指令对应的cond 值是0101(PLUS) 还是?2、Rd为PC寄存器,如何用四位来描述PC[15:12]

0 投票
2 回答
1587 浏览

assembly - 00 的汇编 x86 机器码含义

我想知道机器代码00是什么意思?另外,我有时会在程序中看到机器码 08。08 是什么意思?

0 投票
3 回答
5103 浏览

assembly - 为什么x86-64的jmpq只需要32位长度的地址?

当我objdump -D用来反汇编二进制文件时,典型的代码jmpq是 like e9 7f fe ff ff,用于表示负偏移量。但是,x86-64 的地址是 64(48)位(据我所知),那么这个 32 位地址如何7f fe ff ff代表 64 位绝对地址的负偏移量呢?

此外,是否有任何其他指令,例如jmpand jmpq,但具有 64 位地址位移?如何在 Intel 或 AMD 的手册中找到说明(我搜索过jmpq但一无所获)?


当我搜索时,它似乎被称为 RIP 相对寻址。似乎并非所有指令都这样做。是否有 64 位相对寻址?如果是间接跳转,那么 64 位绝对地址应该在寄存器或内存中,对吧?

0 投票
1 回答
2784 浏览

assembly - 什么是 8086 ESC 指令操作码

主要是历史兴趣,如果我要为汇编程序实现 8086 兼容性,哪些操作数被认为对ESC指令有效?

ESC opcode, source

从 8086 Programmer's manual 我知道,这opcode是 0 到 63 范围内的立即数,source是寄存器或内存。但是可以对哪些寄存器进行编码?两者兼有reg8reg16reg16?如果source是内存,操作数大小(mem8mem16)重要吗?

基本上,从指令编码的角度来看,上述两者都无关紧要(例如,两者esc 0x01, ch都会esc 0x01, bp产生相同的结果),但也许汇编程序有强制限制

最后,我在哪里可以找到ESC操作码的描述?

0 投票
1 回答
6985 浏览

assembly - 为什么 MIPS 没有像 Load Immediate 指令一样的 Store Immediate 指令?

MIPS 有一个 Load Immediate ( LI) 伪指令,用于将 32 位立即数加载到寄存器中。但它没有 Store Immediate ( SI) 指令来将 32 位立即数存储到内存中。有人可以解释我为什么吗?