x86 汇编中是否有仅存在于 64 位模式下的指令?

发布于 2024-08-06 14:19:37 字数 306 浏览 6 评论 0原文

一些旧的 x86 指令在 64 位模式下未定义。例如,LDSLESLSS,或 INC r16 的短操作码 (40 + < em>rw)和 INC r3240 + rd)指令。

是否有任何指令仅在 64 位模式下定义,而不在 32 位保护模式下定义?

编辑:上下文是 x86 处理器的开发。我想确保我符合规范。

Some old x86 instructions are undefined in 64-bit mode. For instance LDS, LES and LSS, or short opcodes of the INC r16 (40 + rw) and INC r32 (40 + rd) instructions.

Are there any instructions that are defined only in 64-bit mode, and not in 32-bit protected mode?

Edit: The context is development of an x86 processor. I want to make sure I'm compatible to the spec.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

悟红尘 2024-08-13 14:19:37

有一种寻址方式,在32位中没有对应的:指令指针相对寻址。在 32 位模式下,这仅适用于分支(也称为分支偏移量),在 64 位模式下,您可以为相对于 (r)ip 的任何内存操作数形成有效地址。

所以,该指令

mov rbx,$100[rip]

在x86-64中确实存在,而

mov ebx,$100[eip]

在x86中则不存在。

There is an addressing mode, which has no counterpart in 32 bit: Instruction pointer relative addressing. In 32 bit mode, this is only available with branches (aka branch offset), in 64 bit mode you can form effective addresses for any memory operand relative to the (r)ip.

So, the instruction

mov rbx,$100[rip]

does exist in x86-64, while

mov ebx,$100[eip]

does not in x86.

你怎么这么可爱啊 2024-08-13 14:19:37

摘自英特尔架构软件开发人员手册,第 2C 卷附录 A(操作码映射):

表 A-1。操作码表中使用的上标

...

o64 指令仅在 64 位模式下可用

...

搜索表,以下指令与该上标一起出现:

  1. REX 前缀(不是真正的指令,但仍然是)
  2. MOVSXD
  3. SYSCALL、SYSRET
  4. SWAPGS

第 5.16 节(64 位模式指令)列出了一些附加指令,它们是现有指令的变体:

  1. CDQE 将双字转换为四字
  2. CMPSQ 比较字符串操作数
  3. CMPXCHG16B 比较 RDX:RAX 与 m128
  4. LODSQ 在地址处加载 qword (R)SI 到 RAX
  5. MOVSQ 将 qword 从地址 (R)SI 移至 (R)DI
  6. MOVZX(64 位) 将双字移至四字,零扩展
  7. STOSQ 将 RAX 存储在地址 RDI 处

From Intel's Architectures Software Developer's Manual, Volume 2C Appendix A (Opcode Map):

Table A-1. Superscripts Utilized in Opcode Tables

...

o64 Instruction is only available when in 64-bit mode

...

Searching the tables, the following instructions appear with that superscript:

  1. REX prefixes (not really an instruction but still)
  2. MOVSXD
  3. SYSCALL, SYSRET
  4. SWAPGS

A few additional instructions which are variants of existing ones are listed in section 5.16 (64-BIT MODE INSTRUCTIONS):

  1. CDQE Convert doubleword to quadword
  2. CMPSQ Compare string operands
  3. CMPXCHG16B Compare RDX:RAX with m128
  4. LODSQ Load qword at address (R)SI into RAX
  5. MOVSQ Move qword from address (R)SI to (R)DI
  6. MOVZX (64-bits) Move doubleword to quadword, zero-extension
  7. STOSQ Store RAX at address RDI
笑脸一如从前 2024-08-13 14:19:37

抛开现在在 64 位寄存器上运行的旧指令(它们确实是新指令,因为它们使用不同的二进制表示形式),我可以想到至少有两条仅 64 位的指令:syscallsysret 指令。

Setting aside old instructions that now operate on 64 bit registers (they are really new instructions as they use a distinct binary representation), I can think of at least two instructions that are 64-bit only: syscall and sysret instructions.

荆棘i 2024-08-13 14:19:37

您可以随时查看不同的手册: http ://www.intel.com/products/processor/index.htm?iid=dev_center+tech_hw_design+prods+processors 查找此类说明。将会有很多艰苦的工作;)

You can always look into the different manuals at http://www.intel.com/products/processor/index.htm?iid=dev_center+tech_hw_design+prods+processors to find such instructions. Will be a lot of work tough ;)

与他有关 2024-08-13 14:19:37

相反的更容易想出;)比如 cmpxchg8b ....你永远不会在 64 位模式下使用它。

the opposite is much easier to come up with;) like cmpxchg8b .... you'd never use that one in 64-bit mode.

£烟消云散 2024-08-13 14:19:37

PUSHA 仅存在于 32 位模式下。 64位模式下不存在

PUSHA exists only in 32 bit mode. It doesnot exist in 64 bit mode

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文