i8086(16bitのx86)の命令フォーマットについて理解を深めるため、データシートを写経して表に整理しました。
探せば既にあるとは思いますが、勉強のため手を動かしてみました。
0/8 | 1/9 | 2/A | 3/B | 4/C | 5/D | 6/E | 7/F | |
---|---|---|---|---|---|---|---|---|
00 | add | add | push | pop | ||||
08 | or | or | ||||||
10 | adc | adc | pop | |||||
18 | sbb | sbb | ||||||
20 | and | and | sr: | daa | ||||
28 | sub | sub | das | |||||
30 | xor | xor | aaa | |||||
38 | cmp | cmp | aas | |||||
40 | inc | |||||||
48 | dec | |||||||
50 | push | |||||||
58 | pop | |||||||
60 | ||||||||
68 | ||||||||
70 | jo | jno | jb/jnae | jnb/jae | je/jz | jne/jnz | jbe/jna | jnbe/ja |
78 | js | jns | jp/jpe | jnp/jpo | jl/jnge | jnl/jge | jle/jng | jnle/jg |
80 | add/or/adc/sbb/and/sub/xor/cmp | test | xchg | |||||
88 | mov | mov | lea | mov | pop | |||
90 | nop | xchg | ||||||
98 | cbw | cwd | callf | wait | pushf | popf | sahf | lahf |
A0 | mov | mov | movs[b/w] | cmps[b/w] | ||||
A8 | test | stos[b/w] | lods[b/w] | scas[b/w] | ||||
B0 | mov | |||||||
B8 | ||||||||
C0 | ret | ret | les | lds | mov | |||
C8 | retf | retf | int | int | into | iret | ||
D0 | rol/ror/rcl/rcr/shl/sal/shr/sar | aam | aad | xlat | ||||
D8 | esc | |||||||
E0 | loop(n)[z/e] | loop | jcxz | in | out | |||
E8 | call | jmp | jmpf | jmp | in | out | ||
F0 | lock | rep(n)z | hlt | cmc | test/not/neg/(i)mul/(i)div | |||
F8 | clc | stc | cli | sti | cld | std | inc/dec/call(f)/jmp(f)/push |
※ 隣接する同じ命令が区切られているのは、オペランドのフォーマットが異なることを意味します。
ざっと眺めた限りでは、00-5Fまでは比較的整理されていますが、70以降はどういう基準で並んでいるのかよく分からないという印象です。
作成過程
英語版WikipediaのIntel 8086からリンクされているデータシートを参照しました。
後半部分に掲載されている命令表をExcelで写経しました。
【注】データシートにいくつかtypoがありました:誤baa→正daa, 誤ssb→正sbb
命令をオペコード順に並べました。
これを見ながら表を作成しました。
次回はこれを基に逆アセンブラを作ります。