В процессе!
Регистр это что то вроде глобальной переменной, только регистры находятся не в оперативной памяти, а прямо в центральном процессоре. Для программиста отличие регистров от глобальных переменных в том, кто некотоыре команды работают только с регистрами.
Программист может использовать следующие 8 битные регистры: a, b, c, d, e, h, l. Использовать 16 битные регистровые пары: bc, de, hl. И 16 битный регистр sp.
Ассемблер 8080 | Cmm (вариант 1) | Cmm (вариант 2) | Описание |
---|---|---|---|
NOP | nop(); | Nop(); | Пустая операция |
HLT | halt(); | Halt(); | Остановка процессора до прерывания |
EI | disable_interrupts(); | DisableInterrupts(); | ??? |
DI | enable_interrupts(); | EnableInterrupts(); | ??? |
STC | set_flag_c(); | SetFlagC(); | Установить флаг CF |
CMC | invert_flag_c(); | InvertFlagC(); | Инвертировать флаг CF |
INR | регистр8++; (*hl)++; | Прибавить 1 | |
DCR | регистр8--; (*hl)--; | Вычесть 1 | |
CMA | invert(a); | Invert(a); | Вычесть 1 |
DAA | asm(" daa"); | Десятичная коррекция A | |
MOV | регистр8 = регистр8; регистр8 = *hl; *hl = регистр8; | Копирование значений | |
STAX | *bc = a; *de = a; | Сохранение значения в память | |
LDAX | a = *bc; a = *de; | Загрузка значения из памяти | |
OUT | out(константа, a); | Out(константа, a); | ??? |
IN | a = in(константа); | a = In(число); | ??? |
ADD | a += регистр8; a += *hl; | ??? | |
ADC | AddCarry(a, регистр8); AddCarry(a, *hl); | ??? | |
SUB | a -= регистр8; a -= *hl; | ??? | |
SBB | SubCarry(a, регистр8); SubCarry(a, *hl); | ??? | |
ANA | a &= регистр8; a &= *hl; | ??? | |
XRA | a ^= регистр8; a ^= *hl; | ??? | |
ORA | a |= регистр8; a |= *hl; | ??? | |
CMP | Compare(a, регистр8); Compare(a, *hl); | ??? | |
RLC | CyclicRotateLeft(a, константа); | ??? | |
RRC | CyclicRotateRight(a, константа); | ??? | |
RAL | CarryRotateLeft(a, константа); | ??? | |
RAR | CarryRotateRight(a, константа); | ??? | |
PUSH | push(пара16); push(a); | ??? В скобках можно указывать несколько регистров. Вместе с A сохраняется регистр флагов. | |
POP | pop(пара16); push(a); | ??? В скобках можно указывать несколько регистров. Вместе с A загружается регистр флагов. | |
DAD | hl += пара16; hl += sp; | ??? | |
INX | пара16++; sp++; | Прибавить 1 | |
DCX | пара16--; sp--; | Вычесть 1 | |
XCHG | swap(hl, de); | Обменять значения регистровых пар DE и HL. | |
XTHL | swap(hl, *sp); | Обменять значения регистровой пары HL и памяти по адресу SP. | |
LXI | пара16 = константа; | ??? | |
MVI | регистр8 = константа; | ??? | |
ADI | a += константа; | ??? | |
ACI | AddCarry(a, константа); | ??? | |
SUI | a -= константа; | ??? | |
SBI | SubCarry(a, константа); | ??? | |
ANI | a &= константа; | ??? | |
XRI | a ^= константа; | ??? | |
ORI | a |= константа; | ??? | |
CPI | Compare(a, константа); | ??? | |
STA | переменная = a; | ??? | |
LTA | a = переменная; | ??? | |
SHLD | переменная = hl; | ??? | |
LHLD | hl = переменная; | ??? | |
PCHL | return hl([команды,]); | ??? | |
JMP | return функция([команды,]); return константа([команды,]); | ??? | |
JC | if (flag_c(команда)) return функция(); | ??? | |
JNC | if (flag_nc(команда)) return функция(); | ??? | |
JZ | if (flag_z(команда)) return функция(); | ??? | |
JNZ | if (flag_nz(команда)) return функция(); | ??? | |
JM | if (flag_m(команда)) return функция(); | ??? | |
JP | if (flag_p(команда)) return функция(); | ??? | |
JPE | if (flag_pe(команда)) return функция(); | ??? | |
JPO | if (flag_po(команда)) return функция(); | ??? | |
RST | Rst(константа); | ??? | |
CALL | функция([команды,]); константа([команды,]); | ??? | |
CC | if (flag_c(команда)) функция(); | ??? | |
CNC | if (flag_nc(команда)) функция(); | ??? | |
CZ | if (flag_z(команда)) функция(); | ??? | |
CNZ | if (flag_nz(команда)) функция(); | ??? | |
CM | if (flag_m(команда)) функция(); | ??? | |
CP | if (flag_p(команда)) функция(); | ??? | |
CPE | if (flag_pe(команда)) функция(); | ??? | |
CPO | if (flag_po(команда)) функция(); | ??? | |
RET | return; | ??? | |
RC | if (flag_c(команда)) return; | ??? | |
RNC | if (flag_nc(команда)) return; | ??? | |
RZ | if (flag_z(команда)) return; | ??? | |
RNZ | if (flag_nz(команда)) return; | ??? | |
RM | if (flag_m(команда)) return; | ??? | |
RP | if (flag_p(команда)) return; | ??? | |
RPE | if (flag_pe(команда)) return; | ??? | |
RPO | if (flag_po(команда)) return; | ??? |
Cmm (вариант 1) | Cmm (вариант 2) | Ассемблер 8080 |
---|---|---|
if (условие) команда | ||
for (команда; условие; команда) команда | ||
do { } while (условие) | ||
while (условие) команда | ||
метка: | ||
goto метка | ||
push_pop(регистры,) команда | ||
break | JMP | |
continue | JMP | |
a *= константа | ADD A (несколько) | |
a <<= константа | ADD A (несколько) | |
"строка" | Заменяется на адрес строки, т.е. число. Строки размещаются специальной конструкцией "uint8_t ConstStrings[];". | |
'строка' | Заменяется на код первого символа. | |
intptr_t(число) | Ничего не делает. Используется для совместимости с инструментами С++. | |
(что угодно) | Используется для изменения порядка выполненяи или вычисления. | |
asm("строка"); | Компиляция строки ассемблера. | |
; | Ничего не делает. | |
число; | Ничего не делает. |
Условия используются в командах: if(), do {} while(), while(), for(;;)
Cmm (вариант 1) | Cmm (вариант 2) | Ассемблер 8080 | Комментарий |
---|---|---|---|
flag_z(команда) | FlagZ(команда) | Если установлен флаг ??? | |
flag_nz(команда) | FlagNz(команда) | Если установлен флаг ??? | |
flag_c(команда) | FlagC(команда) | Если установлен флаг ??? | |
flag_nc(команда) | FlagNc(команда) | Если установлен флаг ??? | |
flag_po(команда) | FlagPo(команда) | Если установлен флаг ??? | |
flag_pe(команда) | FlagPe(команда) | Если установлен флаг ??? | |
flag_p(команда) | FlagP(команда) | Если установлен флаг ??? | |
flag_m(команда) | FlagM(команда) | Если установлен флаг ??? | |
a == регистр8 | CMP регистр8 + JNZ | ||
a == *hl | CMP M + JNZ | ||
a == 0 | ORA A + JNZ | Если вы хотите получить CPI, то замените a == 0 на flag_z(Compare(a, 0)) | |
a == число | CPI число + JNZ | ||
a != регистр8 | CMP регистр8 + JZ | ||
a != *hl | CMP M + JZ | ||
a != 0 | ORA A + JZ | Если вы хотите получить CPI, то замените a != 0 на flag_nz(Compare(a, 0)) | |
a != число | CPI число + JZ | ||
a >= регистр8 | CMP регистр8 + JNС | ||
a >= *hl | CMP M + JNС | ||
a >= число | CPI число + JNС | ||
a < регистр8 | CMP регистр8 + JС | ||
a < *hl | CMP M + JС | ||
a < число | CPI число + JС |
Поддерживаемые типы: uint8_t, int16_t, uint16_t, int32_t, uint64_t, int64_t.
Конструкция | Описание |
---|---|
uint8_t ConstStrings[]; | Разместить в этом месте все строковые константы "" обработанные до этого момента. |
тип имя; | Разместить переменную. Аналог "имя: DS размер". |
тип имя[количество]; | Разместить массив переменных. Аналог "имя: DS размер * количество". |
тип имя = значение; | Разместить переменную. Аналог "имя: DB/DW/DD/DQ значение". |
тип имя[количество] = { значение, }; | Разместить массив переменных. Аналог "имя: DB/DW/DD/DQ значение, значение...". |
extern тип имя; extern тип имя[количество]; | Объясняет компилятору, что переменная переменная размещена в другой единице компиляции или далее. |
extern тип имя __address(константа); extern тип[количество] имя __address(константа); | Объясняет компилятору, что переменная размещена по указанному адресу. |
const int имя = число; | Описание константы. Аналог ассемблера "имя EQU число". |
Команда | Описание |
---|---|
#include | ??? |
#pragma once | ??? |
#define | ??? |
#undef | ??? |
#ifdef | ??? |
#ifndef | ??? |
#else | ??? |
#endif | ??? |
Команда | Описание |
---|---|
align N | Выровнять указатель на N байт. |
savebin "имя файла", начало, конец | Сохранить скомпированную программу в файл. |
equ | ??? |
= | ??? |
org | ??? |
codepage | ??? |
savebin | ??? |
insert_file | ??? |
incbin | ??? |
align | ??? |
end | ??? |
db | ??? |
dw | ??? |
dd | ??? |
dq | ??? |
ds | ??? |
; | ??? |