命令リファレンス

機械語マップ

データ転送命令 算術演算命令 論理演算命令 分岐命令 スタック命令 制御命令 入出力命令
x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF
0x NOP LXI B STAX B INX B INR B DCR B MVI B RLC - DAD B LDAX B DCX B INR C DCR C MVI C RRC
1x - LXI D STAX D INX D INR D DCR D MVI D RAL - DAD D LDAX D DCX D INR E DCR E MVI E RAR
2x - LXI H SHLD INX H INR H DCR H MVI H DAA - DAD H LHLD DCX H INR L DCR L MVI L CMA
3x - LXI SP STA INX SP INR M DCR M MVI M STC - DAD SP LDA DCX SP INR A DCR A MVI A CMC
4x MOV B,B MOV B,C MOV B,D MOV B,E MOV B,H MOV B,L MOV B,M MOV B,A MOV C,B MOV C,C MOV C,D MOV C,E MOV C,H MOV C,L MOV C,M MOV C,A
5x MOV D,B MOV D,C MOV D,D MOV D,E MOV D,H MOV D,L MOV D,M MOV D,A MOV E,B MOV E,C MOV E,D MOV E,E MOV E,H MOV E,L MOV E,M MOV E,A
6x MOV H,B MOV H,C MOV H,D MOV H,E MOV H,H MOV H,L MOV H,M MOV H,A MOV L,B MOV L,C MOV L,D MOV L,E MOV L,H MOV L,L MOV L,M MOV L,A
7x MOV M,B MOV M,C MOV M,D MOV M,E MOV M,H MOV M,L HLT MOV M,A MOV A,B MOV A,C MOV A,D MOV A,E MOV A,H MOV A,L MOV A,M MOV A,A
8x ADD B ADD C ADD D ADD E ADD H ADD L ADD M ADD A ADC B ADC C ADC D ADC E ADC H ADC L ADC M ADC A
9x SUB B SUB C SUB D SUB E SUB H SUB L SUB M SUB A SBB B SBB C SBB D SBB E SBB H SBB L SBB M SBB A
Ax ANA B ANA C ANA D ANA E ANA H ANA L ANA M ANA A XRA B XRA C XRA D XRA E XRA H XRA L XRA M XRA A
Bx ORA B ORA C ORA D ORA E ORA H ORA L ORA M ORA A CMP B CMP C CMP D CMP E CMP H CMP L CMP M CMP A
Cx RNZ POP B JNZ JMP CNZ PUSH B ADI RST 0 RZ RET JZ - CZ CALL ACI RST 1
Dx RNC POP D JNC OUT CNC PUSH D SUI RST 2 RC - JC IN CC - SBI RST 3
Ex RPO POP H JPO XTHL CPO PUSH H ANI RST 4 RPE PCHL JPE XCHG CPE - XRI RST 5
Fx RP POP PSW JP DI CP PUSH PSW ORI RST 6 RM SPHL JM EI CM - CPI RST 7

表記規則

表記意味
rレジスタ(B, C, D, E, H, L, M, A)。Mは[HL](HLが指すメモリ)を意味します。
rpレジスタペア(B=BC, D=DE, H=HL, SP)。PUSH/POPではSPの代わりにPSW(A+フラグ)を使用します。
d88ビット即値データ(命令の次のバイト)
d1616ビット即値データ(命令の次の2バイト、リトルエンディアン)
a1616ビットアドレス(命令の次の2バイト、リトルエンディアン)

レジスタのビットパターン

オペコード内でレジスタを指定する3ビットのパターンです。

ビットパターンレジスタ
000B
001C
010D
011E
100H
101L
110M(メモリ参照)
111A

条件コード

条件付き命令で使用する条件コードです。

条件意味フラグ
NZ非ゼロZ = 0
ZゼロZ = 1
NCキャリーなしCY = 0
CキャリーありCY = 1
POパリティ奇数P = 0
PEパリティ偶数P = 1
P正(プラス)S = 0
M負(マイナス)S = 1

フラグ表記

記号意味
*演算結果に応じて更新されます。
00にクリアされます。
11にセットされます。
-変化しません。

データ転送命令

MOV r1, r2

ソースレジスタの値をデスティネーションレジスタにコピーします。

r1 ← r2
オペコードバイト数フラグ SZACPCY
0x40〜0x7F(0x76を除く)1-----

オペコードのビットパターンは 01DDDSSS です。DDD=デスティネーション、SSS=ソースです。

MVI r, d8

8ビット即値をレジスタにロードします。

r ← d8
オペコードバイト数フラグ SZACPCY
0x06(B), 0x0E(C), 0x16(D), 0x1E(E), 0x26(H), 0x2E(L), 0x36(M), 0x3E(A)2-----

LXI rp, d16

16ビット即値をレジスタペアにロードします。

rp ← d16
オペコードバイト数フラグ SZACPCY
0x01(BC), 0x11(DE), 0x21(HL), 0x31(SP)3-----

LDA a16

指定アドレスのメモリ内容をAレジスタにロードします。

A ← [a16]
オペコードバイト数フラグ SZACPCY
0x3A3-----

STA a16

Aレジスタの値を指定アドレスのメモリに格納します。

[a16] ← A
オペコードバイト数フラグ SZACPCY
0x323-----

LHLD a16

指定アドレスから2バイトをHLレジスタペアにロードします。

L ← [a16], H ← [a16 + 1]
オペコードバイト数フラグ SZACPCY
0x2A3-----

SHLD a16

HLレジスタペアの値を指定アドレスに格納します。

[a16] ← L, [a16 + 1] ← H
オペコードバイト数フラグ SZACPCY
0x223-----

LDAX rp

レジスタペアが指すメモリアドレスの内容をAレジスタにロードします。

A ← [rp]
オペコードバイト数フラグ SZACPCY
0x0A(BC), 0x1A(DE)1-----

STAX rp

Aレジスタの値をレジスタペアが指すメモリアドレスに格納します。

[rp] ← A
オペコードバイト数フラグ SZACPCY
0x02(BC), 0x12(DE)1-----

XCHG

DEレジスタペアとHLレジスタペアの値を交換します。

DE ↔ HL
オペコードバイト数フラグ SZACPCY
0xEB1-----

XTHL

HLレジスタペアとスタックトップの値を交換します。

L ↔ [SP], H ↔ [SP + 1]
オペコードバイト数フラグ SZACPCY
0xE31-----

SPHL

HLレジスタペアの値をSPにコピーします。

SP ← HL
オペコードバイト数フラグ SZACPCY
0xF91-----

算術演算命令

ADD r

Aレジスタにレジスタの値を加算します。

A ← A + r
オペコードバイト数フラグ SZACPCY
0x80(B), 0x81(C), 0x82(D), 0x83(E), 0x84(H), 0x85(L), 0x86(M), 0x87(A)1*****

ADC r

Aレジスタにレジスタの値とキャリーフラグを加算します。

A ← A + r + CY
オペコードバイト数フラグ SZACPCY
0x88(B), 0x89(C), 0x8A(D), 0x8B(E), 0x8C(H), 0x8D(L), 0x8E(M), 0x8F(A)1*****

ADI d8

Aレジスタに8ビット即値を加算します。

A ← A + d8
オペコードバイト数フラグ SZACPCY
0xC62*****

ACI d8

Aレジスタに8ビット即値とキャリーフラグを加算します。

A ← A + d8 + CY
オペコードバイト数フラグ SZACPCY
0xCE2*****

SUB r

Aレジスタからレジスタの値を減算します。

A ← A - r
オペコードバイト数フラグ SZACPCY
0x90(B), 0x91(C), 0x92(D), 0x93(E), 0x94(H), 0x95(L), 0x96(M), 0x97(A)1*****

SBB r

Aレジスタからレジスタの値とキャリーフラグを減算します。

A ← A - r - CY
オペコードバイト数フラグ SZACPCY
0x98(B), 0x99(C), 0x9A(D), 0x9B(E), 0x9C(H), 0x9D(L), 0x9E(M), 0x9F(A)1*****

SUI d8

Aレジスタから8ビット即値を減算します。

A ← A - d8
オペコードバイト数フラグ SZACPCY
0xD62*****

SBI d8

Aレジスタから8ビット即値とキャリーフラグを減算します。

A ← A - d8 - CY
オペコードバイト数フラグ SZACPCY
0xDE2*****

INR r

レジスタの値を1増加します。CYフラグは変化しません。

r ← r + 1
オペコードバイト数フラグ SZACPCY
0x04(B), 0x0C(C), 0x14(D), 0x1C(E), 0x24(H), 0x2C(L), 0x34(M), 0x3C(A)1****-

DCR r

レジスタの値を1減少します。CYフラグは変化しません。

r ← r - 1
オペコードバイト数フラグ SZACPCY
0x05(B), 0x0D(C), 0x15(D), 0x1D(E), 0x25(H), 0x2D(L), 0x35(M), 0x3D(A)1****-

INX rp

レジスタペアの値を1増加します。フラグは変化しません。

rp ← rp + 1
オペコードバイト数フラグ SZACPCY
0x03(BC), 0x13(DE), 0x23(HL), 0x33(SP)1-----

DCX rp

レジスタペアの値を1減少します。フラグは変化しません。

rp ← rp - 1
オペコードバイト数フラグ SZACPCY
0x0B(BC), 0x1B(DE), 0x2B(HL), 0x3B(SP)1-----

DAD rp

HLレジスタペアにレジスタペアの値を加算します(16ビット加算)。CYのみ更新されます。

HL ← HL + rp
オペコードバイト数フラグ SZACPCY
0x09(BC), 0x19(DE), 0x29(HL), 0x39(SP)1----*

DAA

Aレジスタの値をBCD(2進化10進数)に補正します。

加算命令の後に使用し、結果をBCD形式に調整します。補正の条件は以下の通りです。

オペコードバイト数フラグ SZACPCY
0x271*****

論理演算命令

ANA r

Aレジスタとレジスタの値のビットごとのANDを取ります。

A ← A AND r
オペコードバイト数フラグ SZACPCY
0xA0(B), 0xA1(C), 0xA2(D), 0xA3(E), 0xA4(H), 0xA5(L), 0xA6(M), 0xA7(A)1**1*0

XRA r

Aレジスタとレジスタの値のビットごとの排他的ORを取ります。

A ← A XOR r
オペコードバイト数フラグ SZACPCY
0xA8(B), 0xA9(C), 0xAA(D), 0xAB(E), 0xAC(H), 0xAD(L), 0xAE(M), 0xAF(A)1**0*0

ORA r

Aレジスタとレジスタの値のビットごとのORを取ります。

A ← A OR r
オペコードバイト数フラグ SZACPCY
0xB0(B), 0xB1(C), 0xB2(D), 0xB3(E), 0xB4(H), 0xB5(L), 0xB6(M), 0xB7(A)1**0*0

CMP r

Aレジスタからレジスタの値を減算し、フラグのみを更新します。Aレジスタの値は変化しません。

A - r(結果は破棄)

A = r のとき Z = 1、A < r のとき CY = 1 となります。

オペコードバイト数フラグ SZACPCY
0xB8(B), 0xB9(C), 0xBA(D), 0xBB(E), 0xBC(H), 0xBD(L), 0xBE(M), 0xBF(A)1*****

ANI d8

Aレジスタと8ビット即値のビットごとのANDを取ります。

A ← A AND d8
オペコードバイト数フラグ SZACPCY
0xE62**1*0

XRI d8

Aレジスタと8ビット即値のビットごとの排他的ORを取ります。

A ← A XOR d8
オペコードバイト数フラグ SZACPCY
0xEE2**0*0

ORI d8

Aレジスタと8ビット即値のビットごとのORを取ります。

A ← A OR d8
オペコードバイト数フラグ SZACPCY
0xF62**0*0

CPI d8

Aレジスタから8ビット即値を減算し、フラグのみを更新します。Aレジスタの値は変化しません。

A - d8(結果は破棄)

A = d8 のとき Z = 1、A < d8 のとき CY = 1 となります。

オペコードバイト数フラグ SZACPCY
0xFE2*****

RLC

Aレジスタを左に1ビット回転します。ビット7はビット0とCYフラグにコピーされます。

CY ← A.7, A ← (A << 1) | A.7
オペコードバイト数フラグ SZACPCY
0x071----*

RRC

Aレジスタを右に1ビット回転します。ビット0はビット7とCYフラグにコピーされます。

CY ← A.0, A ← (A >> 1) | (A.0 << 7)
オペコードバイト数フラグ SZACPCY
0x0F1----*

RAL

Aレジスタをキャリー経由で左に1ビット回転します。ビット7がCYに、旧CYがビット0に入ります。

temp ← A.7, A ← (A << 1) | CY, CY ← temp
オペコードバイト数フラグ SZACPCY
0x171----*

RAR

Aレジスタをキャリー経由で右に1ビット回転します。ビット0がCYに、旧CYがビット7に入ります。

temp ← A.0, A ← (A >> 1) | (CY << 7), CY ← temp
オペコードバイト数フラグ SZACPCY
0x1F1----*

CMA

Aレジスタの全ビットを反転します(1の補数)。

A ← NOT A
オペコードバイト数フラグ SZACPCY
0x2F1-----

STC

CYフラグを1にセットします。

CY ← 1
オペコードバイト数フラグ SZACPCY
0x371----1

CMC

CYフラグを反転します。

CY ← NOT CY
オペコードバイト数フラグ SZACPCY
0x3F1----*

分岐命令

JMP a16

指定アドレスに無条件ジャンプします。

PC ← a16
オペコードバイト数フラグ SZACPCY
0xC33-----

Jcond a16(条件付きジャンプ)

条件が成立した場合、指定アドレスにジャンプします。不成立の場合は次の命令に進みます。

if (条件成立) then PC ← a16
ニモニックオペコード条件
JNZ0xC2Z = 0
JZ0xCAZ = 1
JNC0xD2CY = 0
JC0xDACY = 1
JPO0xE2P = 0
JPE0xEAP = 1
JP0xF2S = 0
JM0xFAS = 1

全て3バイト命令です。フラグは変化しません。

CALL a16

サブルーチンを呼び出します。戻りアドレス(次の命令のアドレス)をスタックにプッシュし、指定アドレスにジャンプします。

SP ← SP - 2, [SP] ← PC, PC ← a16
オペコードバイト数フラグ SZACPCY
0xCD3-----

Ccond a16(条件付きコール)

条件が成立した場合、サブルーチンを呼び出します。不成立の場合は次の命令に進みます。

if (条件成立) then SP ← SP - 2, [SP] ← PC, PC ← a16
ニモニックオペコード条件
CNZ0xC4Z = 0
CZ0xCCZ = 1
CNC0xD4CY = 0
CC0xDCCY = 1
CPO0xE4P = 0
CPE0xECP = 1
CP0xF4S = 0
CM0xFCS = 1

全て3バイト命令です。フラグは変化しません。

RET

サブルーチンから復帰します。スタックから戻りアドレスをポップし、そのアドレスにジャンプします。

PC ← [SP], SP ← SP + 2
オペコードバイト数フラグ SZACPCY
0xC91-----

Rcond(条件付きリターン)

条件が成立した場合、サブルーチンから復帰します。不成立の場合は次の命令に進みます。

if (条件成立) then PC ← [SP], SP ← SP + 2
ニモニックオペコード条件
RNZ0xC0Z = 0
RZ0xC8Z = 1
RNC0xD0CY = 0
RC0xD8CY = 1
RPO0xE0P = 0
RPE0xE8P = 1
RP0xF0S = 0
RM0xF8S = 1

全て1バイト命令です。フラグは変化しません。

RST n

1バイトのCALL命令です。戻りアドレスをスタックにプッシュし、n × 8 のアドレスにジャンプします。

SP ← SP - 2, [SP] ← PC, PC ← n × 8
ニモニックオペコードジャンプ先
RST 00xC70x0000
RST 10xCF0x0008
RST 20xD70x0010
RST 30xDF0x0018
RST 40xE70x0020
RST 50xEF0x0028
RST 60xF70x0030
RST 70xFF0x0038

フラグは変化しません。

PCHL

HLレジスタペアの値をPCにロードします。HLが指すアドレスにジャンプします。

PC ← HL
オペコードバイト数フラグ SZACPCY
0xE91-----

スタック命令

PUSH rp

レジスタペアの値をスタックにプッシュします。SPを2デクリメントし、上位バイト、下位バイトの順で格納します。

SP ← SP - 2, [SP+1] ← rp上位, [SP] ← rp下位
オペコードバイト数フラグ SZACPCY
0xC5(BC), 0xD5(DE), 0xE5(HL), 0xF5(PSW)1-----

PUSH PSWでは、Aレジスタ(上位)とフラグレジスタ(下位)がプッシュされます。

POP rp

スタックからレジスタペアに値をポップします。下位バイト、上位バイトの順で読み出し、SPを2インクリメントします。

rp下位 ← [SP], rp上位 ← [SP+1], SP ← SP + 2
オペコードバイト数フラグ SZACPCY
0xC1(BC), 0xD1(DE), 0xE1(HL), 0xF1(PSW)1-----

POP PSWでは、フラグレジスタ(下位)とAレジスタ(上位)が復元されます。全フラグが復元されるため、フラグの値が変化します。

制御命令

NOP

何も行いません。

オペコードバイト数フラグ SZACPCY
0x001-----

HLT

CPUを停止します。HLT命令で停止した状態からCPUを再開する方法はありません。再開するにはページをリロードしてください。

オペコードバイト数フラグ SZACPCY
0x761-----

EI

割り込みを許可します。

INTE ← 1
オペコードバイト数フラグ SZACPCY
0xFB1-----

現在、割り込みソースは実装されていません。そのため、現状のEI命令は特に何もしません。

DI

割り込みを禁止します。

INTE ← 0
オペコードバイト数フラグ SZACPCY
0xF31-----

現在、割り込みソースは実装されていません。そのため、現状のDI命令は特に何もしません。

入出力命令

OUT d8

Aレジスタの値を指定ポートに出力します。

port[d8] ← A
オペコードバイト数フラグ SZACPCY
0xD32-----

現在の実装では、OUT命令は何もしません。周辺機器との連携は今後追加予定です。

IN d8

指定ポートから値を読み取り、Aレジスタに格納します。

A ← port[d8]
オペコードバイト数フラグ SZACPCY
0xDB2-----

現在の実装では、IN命令は常に0xFFを返します。周辺機器との連携は今後追加予定です。