X86 英特尔x64指令CMPSB/CMPSW/CMPSD/CMPSQ

X86 英特尔x64指令CMPSB/CMPSW/CMPSD/CMPSQ,x86,64-bit,machine-code,X86,64 Bit,Machine Code,这些说明位于英特尔手册第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

这些说明位于英特尔手册第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

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

  • 两个内存位置之间的比较,这不能用单个
    cmp
    指令完成

  • 比较影响标志,以便您可以在下一条指令中检查结果,或者仅使用
    rep
    /
    repnz
    前缀循环,除非不满足特定条件

  • 根据
    DF
    对两个源操作数进行递增/递减,否则必须由至少两个
    inc
    /
    dec
    add
    /
    sub
    指令执行,后者需要对多个字节执行操作

  • 您还对指令编码表现出了一些兴趣。首先,
    cmpsx
    指令可以通过两种方式进行编码-使用或不使用指定的操作数。这可能特别有用,尽管有一些限制


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

    你能给我一个手册的链接吗当然,有人能拆下支架吗?我编辑了这个问题,想悬赏一下。是的,主要问题是关于编码,我做对了吗??不过,感谢您的解释。只有一种操作数编码:隐式。其他任何东西在汇编级别上都是一种幻觉。我不确定我是否理解,机器代码级别上不是有8种不同的编码吗?我的意思是,如何区分CMPSB上的64位和32位地址?手册上说,您可以使用操作数大小覆盖前缀(0x66)进行操作。