x86-64 上可以使用 64 位直接内存操作数吗?

问题描述 投票:0回答:2

我想知道是否可以对如下指令进行编码:

添加rax,[地址]

其中

是指向 64 位值的完整 64 位地址。 NASM 似乎只是截断地址并将其编码为 32 位地址。唯一有效的 64 位寻址(使用直接地址)形式是:

mov rax,[qword 地址]

由 NASM 使用 REX.W=1 和 MOV 的特殊操作码进行直接寻址编码。将 REX.W 与 add 指令一起使用只会使其将目标地址解释为包含 64 位值,但不允许指定 64 位地址。但我很好奇是否还有其他方法。

(顺便说一句,由于这个问题,我现在使用 RIP 相对寻址)。

谁能确认直接 64 位寻址形式是不可能的?

除某些特殊情况外,amd64架构没有64位位移的寻址模式。相反,使用

rip
相对寻址,如果您的二进制文件大小小于 2 GB,这应该没问题。

请记住,64 位模式是 AMD 的天才之作。 1980 年,英特尔团队坚持认为 INC REG16(2 字节指令)太长,并浪费了 256 个首页操作码中的 16 个来用 1 字节创建别名。 AMD 将其重新用作具有 4 位可用的前缀,在编译器愿意节省一个字节的极少数情况下浪费了一个字节。

对于 64 位操作,第一位表示 1。 剩下的三位用于指定是否是 32 位或 64 位寄存器 故意的。幸运的是,sib 中最复杂的指令有一个主寄存器、一个指针和一个索引,总共三个。 这些被用作开关,因此简单而友善。

在所有其他方面,i386/pentium 指令集均未更改。

所以这回答了你的问题,没有偏离 32 位,没有 64 位地址。批准的答案解释了如何在需要 64 位值的情况下解释 32 位常量。

assembly x86-64
2个回答
4
投票

除某些特殊情况外,amd64架构没有64位位移的寻址模式。相反,使用

rip
相对寻址,如果您的二进制文件大小小于 2 GB,这应该没问题。


0
投票

请记住,64 位模式是 AMD 的天才之作。 1980 年,英特尔团队坚持认为 INC REG16(2 字节指令)太长,并浪费了 256 个首页操作码中的 16 个来用 1 字节创建别名。 AMD 将其重新用作具有 4 位可用的前缀,在编译器愿意节省一个字节的极少数情况下浪费了一个字节。

对于 64 位操作,第一位表示 1。 剩下的三位用于指定是否是 32 位或 64 位寄存器 故意的。幸运的是,sib 中最复杂的指令有一个主寄存器、一个指针和一个索引,总共三个。 这些被用作开关,因此简单而友善。

在所有其他方面,i386/pentium 指令集均未更改。

所以这回答了你的问题,没有偏离 32 位,没有 64 位地址。批准的答案解释了如何在需要 64 位值的情况下解释 32 位常量。

© www.soinside.com 2019 - 2024. All rights reserved.