8080
Intel 8080 が扱うメモリはプログラムとデータで共通で、 16ビット (0x0000 ~ 0xffff) のアドレスを用いてバイト単位でアクセスできる。
また、入出力は、8ビット (0x00 ~ 0xff) のアドレスを指定して1バイトを入出力できる。
Intel 8080 は、以下のレジスタを持つ。
役割 | レジスタ | サイズ |
---|---|---|
アキュムレータ | A | 8ビット |
汎用レジスタ | B, C, D, E, H, L | 各8ビット×6個 |
フラグレジスタ | F | 8ビット |
プログラムカウンタ | PC | 16ビット |
スタックポインタ | SP | 16ビット |
割り込み許可フラグ | INTE | 1ビット |
8ビットレジスタは、以下の16ビットのレジスタ対として用いることがある。
レジスタ対名 | 上位8ビット | 下位8ビット |
---|---|---|
B | B | C |
D | D | E |
H | H | L |
PSW | A | F |
フラグレジスタの内容は、以下の通りである。
ビット | 名前 | 略称 | 説明 |
---|---|---|---|
0 (LSB) | Carry | C | キャリーやボローがあったことを示す。 |
1 | 1 | - | 常に 1 となる。 |
2 | Parity | P | 演算結果に「1」のビットが偶数個あったことを示す。 |
3 | 0 | - | 常に 0 となる。 |
4 | Auxiliary Carry (AC) | A | 下位ニブルから上位ニブルへのキャリーがあったことを示す。 (減算命令でもボローではなくキャリーを示す) |
5 | 0 | - | 常に 0 となる。 |
6 | Zero | Z | 計算結果が 0 であったことを示す。 |
7 (MSB) | Sign | S | 計算結果が負 (最上位ビットが1) であったことを示す。 |
MikeAssemblerでは、以下の命令をサポートしている。
命令およびレジスタ名の大文字・小文字は区別しない。
機械語において、第1オペランドを d
、第2オペランドを s
で表す。
条件分岐命令の条件は c
で表す。
16ビット即値は、下位8ビットを2バイト目に、上位8ビットを3バイト目に置く。
内容 | シンボル | 取りうる値 | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
8ビットレジスタ/メモリ | r/m8 |
| |||||||||||||||||||||||||||
16ビットレジスタ | r16 |
| |||||||||||||||||||||||||||
16ビットレジスタ (スタック) | r16stack |
| |||||||||||||||||||||||||||
16ビットレジスタ (アドレス) | r16addr |
| |||||||||||||||||||||||||||
8ビット即値 | imm8 | -128 ~ 255 の整数 | |||||||||||||||||||||||||||
16ビット即値 | imm16 | -32,768 ~ 65,535 の整数 | |||||||||||||||||||||||||||
8ビット即値 (アドレス) | iaddr8 | 0 ~ 255 の整数 | |||||||||||||||||||||||||||
16ビット即値 (アドレス) | iaddr16 | 0 ~ 65,535 の整数 | |||||||||||||||||||||||||||
ハンドラID | exp | 0 ~ 7 の整数 |
「フラグ」は命令によって値が変化するフラグを示す。
「動作」は逐次実行である。すなわち、後の処理では前の処理で変化した後の値を用いる。
PC
(プログラムカウンタ) は、実行中の命令の次の命令のアドレスを表す。
16ビットのデータ転送は、リトルエンディアン(下位バイトを小さい値のアドレスに格納する)で行う。
データ転送命令 (8ビット) | ||||
---|---|---|---|---|
命令 | 機械語 | 動作 | 解説 | フラグ |
MOV r/m81, r/m82 | 01dddsss |
r/m81 ← r/m82 |
レジスタやメモリの値を別のまたは同一(NOP)のレジスタやメモリに代入する。r/m81 と | - |
MVI r/m8, imm8 | 00ddd110 ssssssss |
r/m8 ← imm8 |
レジスタやメモリに即値を代入する。 | - |
STAX r16addr | 000d0010 |
[r16addr] ← A |
アキュムレータの値をメモリのレジスタ対が指す位置にストアする。 | - |
LDAX r16addr | 000d1010 |
A ← [r16addr] |
メモリのレジスタ対が指す位置からアキュムレータに値をロードする。 | - |
STA iaddr16 | 00110010 dddddddd dddddddd |
[iaddr16] ← A |
アキュムレータの値をメモリの即値で指定する位置にストアする。 | - |
LDA iaddr16 | 00111010 dddddddd dddddddd |
A ← [iaddr16] |
メモリの即値で指定する位置からアキュムレータに値をロードする。 | - |
データ転送命令 (16ビット) | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
LXI r16, imm16 | 00dd0001 ssssssss ssssssss |
r16 ← imm16 |
レジスタ対またはスタックポインタに即値を代入する。 | - |
SHLD iaddr16 | 00100010 dddddddd dddddddd |
[iaddr16] ← {H,L} |
レジスタ対 H の値をメモリの即値で指定する位置にストアする。 | - |
LHLD iaddr16 | 00101010 dddddddd dddddddd |
{H,L} ← [iaddr16] |
メモリの即値で指定する位置からレジスタ対 H に値をロードする。 | - |
XCHG | 11101011 |
temp ← {H,L}; {H,L} ← {D,E}; {D,E} ← temp |
レジスタ対 D とレジスタ対 H の値を交換する。 | - |
演算命令 (8ビット) | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
INR r/m8 | 00ddd100 |
r/m8 ← r/m8 + 1 |
レジスタまたはメモリの値をインクリメントする。(1を加える) | S Z A P |
DCR r/m8 | 00ddd101 |
r/m8 ← r/m8 - 1 |
レジスタまたはメモリの値をデクリメントする。(1を引く) | S Z A P |
ADD r/m8 | 10000ddd |
A ← A + r/m8 |
アキュムレータにレジスタまたはメモリの値を加える。 | S Z A P C |
ADC r/m8 | 10001ddd |
A ← A + r/m8 + Carry |
アキュムレータにレジスタまたはメモリの値とキャリーの値を加える。 | S Z A P C |
SUB r/m8 | 10010ddd |
A ← A - r/m8 |
アキュムレータからレジスタまたはメモリの値を引く。 | S Z A P C |
SBB r/m8 | 10011ddd |
A ← A - r/m8 - Carry |
アキュムレータからレジスタまたはメモリの値とキャリー(ボロー)の値を引く。 | S Z A P C |
ANA r/m8 | 10100ddd |
A ← A & r/m8 |
アキュムレータにレジスタまたはメモリの値をビットANDする。 Carry フラグは 0 になる。 | S Z A P C |
XRA r/m8 | 10101ddd |
A ← A ^ r/m8 |
アキュムレータにレジスタまたはメモリの値をビットXORする。 Carry フラグは 0 になる。 | S Z A P C |
ORA r/m8 | 10110ddd |
A ← A | r/m8 |
アキュムレータにレジスタまたはメモリの値をビットORする。 Carry フラグは 0 になる。 | S Z A P C |
CMP r/m8 | 10111ddd |
A - r/m8 |
アキュムレータからレジスタまたはメモリの値を引き、差の値を捨てる。(比較) | S Z A P C |
ADI imm8 | 11000110 dddddddd |
A ← A + imm8 |
アキュムレータに即値を加える。 | S Z A P C |
ACI imm8 | 11001110 dddddddd |
A ← A + imm8 + Carry |
アキュムレータに即値とキャリーの値を加える。 | S Z A P C |
SUI imm8 | 11010110 dddddddd |
A ← A - imm8 |
アキュムレータから即値を引く。 | S Z A P C |
SBI imm8 | 11011110 dddddddd |
A ← A - imm8 - Carry |
アキュムレータから即値とキャリー(ボロー)の値を引く。 | S Z A P C |
ANI imm8 | 11100110 dddddddd |
A ← A & imm8 |
アキュムレータに即値をビットANDする。 Carry フラグは 0 になる。 | S Z A P C |
XRI imm8 | 11101110 dddddddd |
A ← A ^ imm8 |
アキュムレータに即値をビットXORする。 Carry フラグは 0 になる。 | S Z A P C |
ORI imm8 | 11110110 dddddddd |
A ← A | imm8 |
アキュムレータに即値をビットORする。 Carry フラグは 0 になる。 | S Z A P C |
CPI imm8 | 11111110 dddddddd |
A - imm8 |
アキュムレータから即値を引き、差の値を捨てる。(比較) | S Z A P C |
RLC | 00000111 |
Carry ← A[7]; A ← {A[6:0],A[7]} |
アキュムレータを1ビット左ローテートする。 | C |
RRC | 00001111 |
Carry ← A[0]; A ← {A[0],A[7:1]} |
アキュムレータを1ビット右ローテートする。 | C |
RAL | 00010111 |
{Carry,A} ← {A,Carry} |
アキュムレータを1ビット左シフトし、最下位ビットに Carry フラグの値を入れる。 | C |
RAR | 00011111 |
{A,Carry} ← {Carry,A} |
アキュムレータを1ビット右シフトし、最上位ビットに Carry フラグの値を入れる。 | C |
CMA | 00101111 |
A ← ~A |
アキュムレータをビットNOTする。 | - |
DAA | 00100111 |
if (A[3:0] > 9 || AC) A ← A + 6; |
4ビット2桁のBCDとして、アキュムレータの加算結果を補正する。 Carry フラグは、後半の処理でキャリーが発生した場合 1 になり、そうでない場合は変化しない。 | S Z A P C |
演算命令 (16ビット) | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
DAD r16 | 00dd1001 |
{H,L} ← {H,L} + r16 |
レジスタ対 H にレジスタ対またはスタックポインタの値を加える。Carry フラグは(下位バイトではなく)最上位からのキャリーを表す。 | C |
INX r16 | 00dd0011 |
r16 ← r16 + 1 |
レジスタ対またはスタックポインタの値をインクリメントする。(1を加える) | - |
DCX r16 | 00dd1011 |
r16 ← r16 - 1 |
レジスタ対またはスタックポインタの値をデクリメントする。(1を引く) | - |
スタック操作命令 | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
XTHL | 11100011 |
temp ← {H,L}; {H,L} ← [SP]; [SP] ← temp |
レジスタ対 H の値とスタックトップの値を交換する。 | - |
PUSH r16stack | 11dd0101 |
SP ← SP - 2; [SP] ← r16stack |
スタックポインタの値から2を引き、新しいスタックポインタが指す位置にレジスタ対の値をストアする。 (スタックにレジスタ対の値をプッシュする) | - |
POP r16stack | 11dd0001 |
r16stack ← [SP]; SP ← SP + 2 |
スタックポインタが指す位置からレジスタ対に値をロードしたあと、スタックポインタの値に2を足す。 (スタックからレジスタ対に値をポップする) レジスタ対 PSW にロードする場合、フラグがそれに応じて変化する。それ以外のレジスタ対にロードする場合、フラグは変化しない。 | S Z A P C |
SPHL | 11111001 |
SP ← {H,L} |
スタックポインタにレジスタ対 H の値を代入する。 | - |
分岐命令 | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
PCHL | 11101001 |
PC ← {H,L} |
無条件で、レジスタ対 H が指す位置へジャンプする。 | - |
JMP iaddr16 | 11000011 dddddddd dddddddd |
PC ← iaddr16 |
無条件で、即値が指す位置へジャンプする。 | - |
Jcc iaddr16 | 11ccc010 dddddddd dddddddd |
if (cc) PC ← iaddr16 |
条件を満たす場合、即値が指す位置へジャンプする。 条件を満たさない場合は何もしない。 | - |
CALL iaddr16 | 11001101 dddddddd dddddddd |
SP ← SP - 2; [SP] ← PC; PC ← iaddr16 |
無条件で、次の命令のアドレスをスタックにプッシュし、即値が指す位置へジャンプする。 (サブルーチンコール) | - |
Ccc iaddr16 | 11ccc100 dddddddd dddddddd |
if (cc) { SP ← SP - 2; [SP] ← PC; PC ← iaddr16 } |
条件を満たす場合、次の命令のアドレスをスタックにプッシュし、即値が指す位置へジャンプする。 条件を満たさない場合は何もしない。 | - |
RET | 11001001 |
PC ← [SP]; SP ← SP + 2 |
無条件で、スタックからアドレスをポップし、そのアドレスが指す位置へジャンプする。 (サブルーチンからの復帰) | - |
Rcc | 11ccc000 |
if (cc) { PC ← [SP]; SP ← SP + 2 } |
条件を満たす場合、スタックからアドレスをポップし、そのアドレスが指す位置へジャンプする。 条件を満たさない場合は何もしない。 | - |
入出力命令 | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
OUT iaddr8 | 11010011 dddddddd |
PORT(iaddr8) ← A |
iaddr8 が示す出力ポートにアキュムレータの値を出力する。 | - |
IN iaddr8 | 11011011 dddddddd |
A ← PORT(iaddr8) |
iaddr8 が示す入力ポートから値を読み取り、アキュムレータに代入する。 | - |
割り込み制御命令 | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
DI | 11110011 |
INTE ← 0 |
割り込みを禁止する。 | - |
EI | 11111011 |
INTE ← 1 |
割り込みを許可する。 | - |
RST exp | 11ddd111 |
SP ← SP - 2; [SP] ← PC; PC ← exp << 3 |
次の命令のアドレスをスタックにプッシュし、exp の 8 倍のアドレスにジャンプする。 | - |
その他命令 | ||||
命令 | 機械語 | 動作 | 解説 | フラグ |
NOP | 00000000 |
- | 何もしない。 | - |
HLT | 01110110 |
- | 割り込みがかかるまで、プログラムの実行を停止する。 | - |
STC | 00110111 |
Carry ← 1 |
Carry フラグを 1 にする。 | C |
CMC | 00111111 |
Carry ← ~Carry |
Carry フラグを反転する。 | C |
条件分岐命令では、cc
として以下の条件を用いることができる。
記号 | 機械語 | ジャンプする条件 | 条件の解釈 |
---|---|---|---|
NZ | 000 | Zero フラグが 0 | 計算結果が非零、比較の結果不一致 |
Z | 001 | Zero フラグが 1 | 計算結果が零、比較の結果一致 |
NC | 010 | Carry フラグが 0 | キャリー/ボローなし、比較の結果引かれる数が引く数以上 |
C | 011 | Carry フラグが 1 | キャリー/ボローあり、比較の結果引かれる数が引く数未満 |
PO | 100 | Parity フラグが 0 | 計算結果に「1」のビットが奇数個 |
PE | 101 | Parity フラグが 1 | 計算結果に「1」のビットが偶数個 |
P | 110 | Sign フラグが 0 | 計算結果が非負 (最上位ビットが 0) |
M | 111 | Sign フラグが 1 | 計算結果が負 (最上位ビットが 1) |
たとえば、Zero フラグが 0 のときジャンプし、1 のとき素通りする命令は JNZ iaddr16
である。