x86-64 での nop と xchg eax, eax

いや上のを書いててふと思ったが、x86-64 の nop って xchg eax, eax ではなくね?

http://www.pagetable.com/?p=6

やっぱそうなのか…


x86-32

  • 本物の nop 命令は存在しない
  • xchg eax, eax (0x90) は何もしない命令として、nop の別名が付いている

x86-64

  • 0x90 は、本物の nop
  • xchg eax, eax (上位32bitクリア) と nop (何もしない) は意味が変わる
  • xchg eax, ecx は 1byte で書ける(0x91) これは上位クリアする
  • xchg eax, eax は 1byte で書けない(0x87 0xc0)
Disassembly of section .text:

0000000000000000 <a>:
   0:   90                      nop
   1:   87 c0                   xchg   %eax,%eax
   3:   91                      xchg   %eax,%ecx
   4:   92                      xchg   %eax,%edx
   5:   93                      xchg   %eax,%ebx

へぇ…