MikeAssembler リファレンス - Intel 8080

アーキテクチャ名

8080

メモリ空間

Intel 8080 が扱うメモリはプログラムとデータで共通で、 16ビット (0x0000 ~ 0xffff) のアドレスを用いてバイト単位でアクセスできる。

また、入出力は、8ビット (0x00 ~ 0xff) のアドレスを指定して1バイトを入出力できる。

レジスタ

Intel 8080 は、以下のレジスタを持つ。

役割レジスタサイズ
アキュムレータA8ビット
汎用レジスタB, C, D, E, H, L各8ビット×6個
フラグレジスタF8ビット
プログラムカウンタPC16ビット
スタックポインタSP16ビット
割り込み許可フラグINTE1ビット

8ビットレジスタは、以下の16ビットのレジスタ対として用いることがある。

レジスタ対名上位8ビット下位8ビット
BBC
DDE
HHL
PSWAF

フラグレジスタの内容は、以下の通りである。

ビット名前略称説明
0 (LSB)CarryCキャリーやボローがあったことを示す。
11-常に 1 となる。
2ParityP演算結果に「1」のビットが偶数個あったことを示す。
30-常に 0 となる。
4Auxiliary Carry (AC)A下位ニブルから上位ニブルへのキャリーがあったことを示す。
(減算命令でもボローではなくキャリーを示す)
50-常に 0 となる。
6ZeroZ計算結果が 0 であったことを示す。
7 (MSB)SignS計算結果が負 (最上位ビットが1) であったことを示す。

命令セット

MikeAssemblerでは、以下の命令をサポートしている。
命令およびレジスタ名の大文字・小文字は区別しない。

扱うデータ

機械語において、第1オペランドを d、第2オペランドを s で表す。
条件分岐命令の条件は c で表す。
16ビット即値は、下位8ビットを2バイト目に、上位8ビットを3バイト目に置く。

内容シンボル取りうる値
8ビットレジスタ/メモリr/m8
機械語備考
B000汎用レジスタ
C001汎用レジスタ
D010汎用レジスタ
E011汎用レジスタ
H100汎用レジスタ
L101汎用レジスタ
M110メモリ、アドレスはレジスタ対 H の値
A111アキュムレータ
16ビットレジスタr16
機械語備考
B00レジスタ対
D01レジスタ対
H10レジスタ対
SP11スタックポインタ
16ビットレジスタ
(スタック)
r16stack
機械語備考
B00レジスタ対
D01レジスタ対
H10レジスタ対
PSW11レジスタ対
16ビットレジスタ
(アドレス)
r16addr
機械語備考
B0レジスタ対
D1レジスタ対
8ビット即値imm8-128 ~ 255 の整数
16ビット即値imm16-32,768 ~ 65,535 の整数
8ビット即値
(アドレス)
iaddr80 ~ 255 の整数
16ビット即値
(アドレス)
iaddr160 ~ 65,535 の整数
ハンドラIDexp0 ~ 7 の整数

命令セット

「フラグ」は命令によって値が変化するフラグを示す。
「動作」は逐次実行である。すなわち、後の処理では前の処理で変化した後の値を用いる。
PC (プログラムカウンタ) は、実行中の命令の次の命令のアドレスを表す。
16ビットのデータ転送は、リトルエンディアン(下位バイトを小さい値のアドレスに格納する)で行う。

データ転送命令 (8ビット)
命令機械語動作解説フラグ
MOV r/m81, r/m8201dddsss r/m81 ← r/m82 レジスタやメモリの値を別のまたは同一(NOP)のレジスタやメモリに代入する。
r/m81r/m82 の両方を M にすることはできない。
-
MVI r/m8, imm800ddd110 ssssssss r/m8 ← imm8 レジスタやメモリに即値を代入する。-
STAX r16addr000d0010 [r16addr] ← A アキュムレータの値をメモリのレジスタ対が指す位置にストアする。-
LDAX r16addr000d1010 A ← [r16addr] メモリのレジスタ対が指す位置からアキュムレータに値をロードする。-
STA iaddr1600110010 dddddddd dddddddd [iaddr16] ← A アキュムレータの値をメモリの即値で指定する位置にストアする。-
LDA iaddr1600111010 dddddddd dddddddd A ← [iaddr16] メモリの即値で指定する位置からアキュムレータに値をロードする。-
データ転送命令 (16ビット)
命令機械語動作解説フラグ
LXI r16, imm1600dd0001 ssssssss ssssssss r16 ← imm16 レジスタ対またはスタックポインタに即値を代入する。-
SHLD iaddr1600100010 dddddddd dddddddd [iaddr16] ← {H,L} レジスタ対 H の値をメモリの即値で指定する位置にストアする。-
LHLD iaddr1600101010 dddddddd dddddddd {H,L} ← [iaddr16] メモリの即値で指定する位置からレジスタ対 H に値をロードする。-
XCHG11101011 temp ← {H,L}; {H,L} ← {D,E}; {D,E} ← temp レジスタ対 D とレジスタ対 H の値を交換する。-
演算命令 (8ビット)
命令機械語動作解説フラグ
INR r/m800ddd100 r/m8 ← r/m8 + 1 レジスタまたはメモリの値をインクリメントする。(1を加える)S Z A P
DCR r/m800ddd101 r/m8 ← r/m8 - 1 レジスタまたはメモリの値をデクリメントする。(1を引く)S Z A P
ADD r/m810000ddd A ← A + r/m8 アキュムレータにレジスタまたはメモリの値を加える。S Z A P C
ADC r/m810001ddd A ← A + r/m8 + Carry アキュムレータにレジスタまたはメモリの値とキャリーの値を加える。S Z A P C
SUB r/m810010ddd A ← A - r/m8 アキュムレータからレジスタまたはメモリの値を引く。S Z A P C
SBB r/m810011ddd A ← A - r/m8 - Carry アキュムレータからレジスタまたはメモリの値とキャリー(ボロー)の値を引く。S Z A P C
ANA r/m810100ddd A ← A & r/m8 アキュムレータにレジスタまたはメモリの値をビットANDする。
Carry フラグは 0 になる。
S Z A P C
XRA r/m810101ddd A ← A ^ r/m8 アキュムレータにレジスタまたはメモリの値をビットXORする。
Carry フラグは 0 になる。
S Z A P C
ORA r/m810110ddd A ← A | r/m8 アキュムレータにレジスタまたはメモリの値をビットORする。
Carry フラグは 0 になる。
S Z A P C
CMP r/m810111ddd A - r/m8 アキュムレータからレジスタまたはメモリの値を引き、差の値を捨てる。(比較)S Z A P C
ADI imm811000110 dddddddd A ← A + imm8 アキュムレータに即値を加える。S Z A P C
ACI imm811001110 dddddddd A ← A + imm8 + Carry アキュムレータに即値とキャリーの値を加える。S Z A P C
SUI imm811010110 dddddddd A ← A - imm8 アキュムレータから即値を引く。S Z A P C
SBI imm811011110 dddddddd A ← A - imm8 - Carry アキュムレータから即値とキャリー(ボロー)の値を引く。S Z A P C
ANI imm811100110 dddddddd A ← A & imm8 アキュムレータに即値をビットANDする。
Carry フラグは 0 になる。
S Z A P C
XRI imm811101110 dddddddd A ← A ^ imm8 アキュムレータに即値をビットXORする。
Carry フラグは 0 になる。
S Z A P C
ORI imm811110110 dddddddd A ← A | imm8 アキュムレータに即値をビットORする。
Carry フラグは 0 になる。
S Z A P C
CPI imm811111110 dddddddd A - imm8 アキュムレータから即値を引き、差の値を捨てる。(比較)S Z A P C
RLC00000111 Carry ← A[7]; A ← {A[6:0],A[7]} アキュムレータを1ビット左ローテートする。C
RRC00001111 Carry ← A[0]; A ← {A[0],A[7:1]} アキュムレータを1ビット右ローテートする。C
RAL00010111 {Carry,A} ← {A,Carry} アキュムレータを1ビット左シフトし、最下位ビットに Carry フラグの値を入れる。C
RAR00011111 {A,Carry} ← {Carry,A} アキュムレータを1ビット右シフトし、最上位ビットに Carry フラグの値を入れる。C
CMA00101111 A ← ~A アキュムレータをビットNOTする。-
DAA00100111 if (A[3:0] > 9 || AC) A ← A + 6;
if (A[7:4] > 9 || Carry) A[7:4] ← A[7:4] + 6
4ビット2桁のBCDとして、アキュムレータの加算結果を補正する。
Carry フラグは、後半の処理でキャリーが発生した場合 1 になり、そうでない場合は変化しない。
S Z A P C
演算命令 (16ビット)
命令機械語動作解説フラグ
DAD r1600dd1001 {H,L} ← {H,L} + r16 レジスタ対 H にレジスタ対またはスタックポインタの値を加える。
Carry フラグは(下位バイトではなく)最上位からのキャリーを表す。
C
INX r1600dd0011 r16 ← r16 + 1 レジスタ対またはスタックポインタの値をインクリメントする。(1を加える)-
DCX r1600dd1011 r16 ← r16 - 1 レジスタ対またはスタックポインタの値をデクリメントする。(1を引く)-
スタック操作命令
命令機械語動作解説フラグ
XTHL11100011 temp ← {H,L}; {H,L} ← [SP]; [SP] ← temp レジスタ対 H の値とスタックトップの値を交換する。-
PUSH r16stack11dd0101 SP ← SP - 2; [SP] ← r16stack スタックポインタの値から2を引き、新しいスタックポインタが指す位置にレジスタ対の値をストアする。
(スタックにレジスタ対の値をプッシュする)
-
POP r16stack11dd0001 r16stack ← [SP]; SP ← SP + 2 スタックポインタが指す位置からレジスタ対に値をロードしたあと、スタックポインタの値に2を足す。
(スタックからレジスタ対に値をポップする)
レジスタ対 PSW にロードする場合、フラグがそれに応じて変化する。
それ以外のレジスタ対にロードする場合、フラグは変化しない。
S Z A P C
SPHL11111001 SP ← {H,L} スタックポインタにレジスタ対 H の値を代入する。-
分岐命令
命令機械語動作解説フラグ
PCHL11101001 PC ← {H,L} 無条件で、レジスタ対 H が指す位置へジャンプする。-
JMP iaddr1611000011 dddddddd dddddddd PC ← iaddr16 無条件で、即値が指す位置へジャンプする。-
Jcc iaddr1611ccc010 dddddddd dddddddd if (cc) PC ← iaddr16 条件を満たす場合、即値が指す位置へジャンプする。
条件を満たさない場合は何もしない。
-
CALL iaddr1611001101 dddddddd dddddddd SP ← SP - 2; [SP] ← PC; PC ← iaddr16 無条件で、次の命令のアドレスをスタックにプッシュし、即値が指す位置へジャンプする。
(サブルーチンコール)
-
Ccc iaddr1611ccc100 dddddddd dddddddd if (cc) { SP ← SP - 2; [SP] ← PC; PC ← iaddr16 } 条件を満たす場合、次の命令のアドレスをスタックにプッシュし、即値が指す位置へジャンプする。
条件を満たさない場合は何もしない。
-
RET11001001 PC ← [SP]; SP ← SP + 2 無条件で、スタックからアドレスをポップし、そのアドレスが指す位置へジャンプする。
(サブルーチンからの復帰)
-
Rcc11ccc000 if (cc) { PC ← [SP]; SP ← SP + 2 } 条件を満たす場合、スタックからアドレスをポップし、そのアドレスが指す位置へジャンプする。
条件を満たさない場合は何もしない。
-
入出力命令
命令機械語動作解説フラグ
OUT iaddr811010011 dddddddd PORT(iaddr8) ← A iaddr8 が示す出力ポートにアキュムレータの値を出力する。-
IN iaddr811011011 dddddddd A ← PORT(iaddr8) iaddr8 が示す入力ポートから値を読み取り、アキュムレータに代入する。-
割り込み制御命令
命令機械語動作解説フラグ
DI11110011 INTE ← 0 割り込みを禁止する。-
EI11111011 INTE ← 1 割り込みを許可する。-
RST exp11ddd111 SP ← SP - 2; [SP] ← PC; PC ← exp << 3 次の命令のアドレスをスタックにプッシュし、exp の 8 倍のアドレスにジャンプする。-
その他命令
命令機械語動作解説フラグ
NOP00000000 - 何もしない。-
HLT01110110 - 割り込みがかかるまで、プログラムの実行を停止する。-
STC00110111 Carry ← 1 Carry フラグを 1 にする。C
CMC00111111 Carry ← ~Carry Carry フラグを反転する。C

条件分岐の条件

条件分岐命令では、cc として以下の条件を用いることができる。

記号機械語ジャンプする条件条件の解釈
NZ000Zero フラグが 0計算結果が非零、比較の結果不一致
Z001Zero フラグが 1計算結果が零、比較の結果一致
NC010Carry フラグが 0キャリー/ボローなし、比較の結果引かれる数が引く数以上
C011Carry フラグが 1キャリー/ボローあり、比較の結果引かれる数が引く数未満
PO100Parity フラグが 0計算結果に「1」のビットが奇数個
PE101Parity フラグが 1計算結果に「1」のビットが偶数個
P110Sign フラグが 0計算結果が非負 (最上位ビットが 0)
M111Sign フラグが 1計算結果が負 (最上位ビットが 1)

たとえば、Zero フラグが 0 のときジャンプし、1 のとき素通りする命令は JNZ iaddr16 である。

参考資料


戻る