【问题标题】:Intel x64 instructions CMPSB/CMPSW/CMPSD/CMPSQ [closed]英特尔 x64 指令 CMPSB/CMPSW/CMPSD/CMPSQ [关闭]
【发布时间】:2015-06-10 03:46:19
【问题描述】:

这些说明位于英特尔手册的第 558 页。我明白了一般的想法,但我坚持这些指令的确切编码。以上是我的理解,如有错误请指正。这都是 64 位模式。

Opcode - Instruction: 
A6 - compare byte at address RSI with byte at address RDI
67 A6 - compare byte at address ESI with byte at address EDI

66 A7 - compare word at address RSI with word at address RDI
67 66 A7 - compare word at address ESI with word at address EDI

A7 - compare dword at address RSI with dword at address RDI
67 A7 - compare dword at address ESI with dword at address EDI

REX.W A7 - Compares quadword at address RSI with quadword at address RDI
67 REX.W A7 - Compares quadword at address ESI with quadword at address EDI

【问题讨论】:

标签: x86 64-bit machine-code


【解决方案1】:

说到这些指令的用途,我们必须意识到它们可以帮助程序员自动化字符串(在连续内存元素的意义上)比较,以便完成三件事

  1. 两个内存位置的比较,单条cmp指令无法做到

  2. 比较影响标志位,这样你就可以在下一条指令中检查结果,或者只使用rep/repnz前缀循环,除非某个条件不满足。

  3. 根据DF 对两个源操作数进行递增/递减,否则必须通过至少两条inc/decadd/sub 指令来完成,后者多于一个字节的操作需要

您还表现出对指令编码的兴趣。首先,cmpsx 指令可以用两种方式编码——有或没有指定的操作数。这可能特别有用,尽管有一些限制。

其他东西只是在玩前缀字节。请注意,您可以使用段覆盖前缀覆盖第一个源操作数的段,但不能覆盖 es 作为第二个操作数的段。

【讨论】:

  • 是的,主要问题是关于编码,我做对了吗?不过还是谢谢你的解释。
  • 只有一种操作数编码:隐式。其他任何东西都是装配级别的幻觉。
  • 我不确定我是否理解,机器码级别不是有8种不同的编码吗?
  • 我的意思是你如何区分 CMPSB 上的 64 位和 32 位地址?手册说你可以做任何一个。
  • @RyanBrown 您使用操作数大小覆盖前缀 (0x66)。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2020-05-12
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2012-05-20
相关资源
最近更新 更多