【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

i8086の命令表

i8086(16bitのx86)の命令フォーマットについて理解を深めるため、データシートを写経して表に整理しました。

探せば既にあるとは思いますが、勉強のため手を動かしてみました。

0/81/92/A3/B4/C5/D6/E7/F
00addaddpushpop
08oror
10adcadcpop
18sbbsbb
20andandsr:daa
28subsubdas
30xorxoraaa
38cmpcmpaas
40inc
48dec
50push
58pop
60
68
70jojnojb/jnaejnb/jaeje/jzjne/jnzjbe/jnajnbe/ja
78jsjnsjp/jpejnp/jpojl/jngejnl/jgejle/jngjnle/jg
80add/or/adc/sbb/and/sub/xor/cmptestxchg
88movmovleamovpop
90nopxchg
98cbwcwdcallfwaitpushfpopfsahflahf
A0movmovmovs[b/w]cmps[b/w]
A8teststos[b/w]lods[b/w]scas[b/w]
B0mov
B8
C0retretlesldsmov
C8retfretfintintintoiret
D0rol/ror/rcl/rcr/shl/sal/shr/saraamaadxlat
D8esc
E0loop(n)[z/e]loopjcxzinout
E8calljmpjmpfjmpinout
F0lockrep(n)zhltcmctest/not/neg/(i)mul/(i)div
F8clcstcclisticldstdinc/dec/call(f)/jmp(f)/push

※ 隣接する同じ命令が区切られているのは、オペランドのフォーマットが異なることを意味します。

ざっと眺めた限りでは、00-5Fまでは比較的整理されていますが、70以降はどういう基準で並んでいるのかよく分からないという印象です。

作成過程

英語版WikipediaのIntel 8086からリンクされているデータシートを参照しました。

後半部分に掲載されている命令表をExcelで写経しました。

【注】データシートにいくつかtypoがありました:誤baa→正daa, 誤ssb→正sbb

命令をオペコード順に並べました。

これを見ながら表を作成しました。

次回はこれを基に逆アセンブラを作ります。