В процессе!

Регистры

Регистр это что то вроде глобальной переменной, только регистры находятся не в оперативной памяти, а прямо в центральном процессоре. Для программиста отличие регистров от глобальных переменных в том, кто некотоыре команды работают только с регистрами.

Программист может использовать следующие 8 битные регистры: a, b, c, d, e, h, l. Использовать 16 битные регистровые пары: bc, de, hl. И 16 битный регистр sp.

Инструкции процессора
Ассемблер 8080Cmm (вариант 1)Cmm (вариант 2)Описание
NOPnop();Nop();Пустая операция
HLThalt();Halt();Остановка процессора до прерывания
EIdisable_interrupts();DisableInterrupts();???
DIenable_interrupts();EnableInterrupts();???
STCset_flag_c();SetFlagC();Установить флаг CF
CMCinvert_flag_c();InvertFlagC();Инвертировать флаг CF
INRрегистр8++;
(*hl)++;
Прибавить 1
DCRрегистр8--;
(*hl)--;
Вычесть 1
CMAinvert(a);Invert(a);Вычесть 1
DAAasm(" daa");Десятичная коррекция A
MOVрегистр8 = регистр8;
регистр8 = *hl;
*hl = регистр8;
Копирование значений
STAX*bc = a;
*de = a;
Сохранение значения в память
LDAXa = *bc;
a = *de;
Загрузка значения из памяти
OUTout(константа, a);Out(константа, a);???
INa = in(константа);a = In(число);???
ADDa += регистр8;
a += *hl;
???
ADCAddCarry(a, регистр8);
AddCarry(a, *hl);
???
SUBa -= регистр8;
a -= *hl;
???
SBBSubCarry(a, регистр8);
SubCarry(a, *hl);
???
ANAa &= регистр8;
a &= *hl;
???
XRAa ^= регистр8;
a ^= *hl;
???
ORAa |= регистр8;
a |= *hl;
???
CMPCompare(a, регистр8);
Compare(a, *hl);
???
RLCCyclicRotateLeft(a, константа);
???
RRCCyclicRotateRight(a, константа);
???
RALCarryRotateLeft(a, константа);
???
RARCarryRotateRight(a, константа);
???
PUSHpush(пара16);
push(a);
???
В скобках можно указывать несколько регистров.
Вместе с A сохраняется регистр флагов.
POPpop(пара16);
push(a);
???
В скобках можно указывать несколько регистров.
Вместе с A загружается регистр флагов.
DADhl += пара16;
hl += sp;
???
INXпара16++;
sp++;
Прибавить 1
DCXпара16--;
sp--;
Вычесть 1
XCHGswap(hl, de);Обменять значения регистровых пар DE и HL.
XTHLswap(hl, *sp);Обменять значения регистровой пары HL и памяти по адресу SP.
LXIпара16 = константа;???
MVIрегистр8 = константа;???
ADIa += константа;
???
ACIAddCarry(a, константа);
???
SUIa -= константа;
???
SBISubCarry(a, константа);
???
ANIa &= константа;
???
XRIa ^= константа;
???
ORIa |= константа;
???
CPICompare(a, константа);
???
STAпеременная = a;
???
LTAa = переменная;
???
SHLDпеременная = hl;
???
LHLDhl = переменная;
???
PCHLreturn hl([команды,]);
???
JMPreturn функция([команды,]);
return константа([команды,]);
???
JCif (flag_c(команда)) return функция();???
JNCif (flag_nc(команда)) return функция();???
JZif (flag_z(команда)) return функция();???
JNZif (flag_nz(команда)) return функция();???
JMif (flag_m(команда)) return функция();???
JPif (flag_p(команда)) return функция();???
JPEif (flag_pe(команда)) return функция();???
JPOif (flag_po(команда)) return функция();???
RSTRst(константа);???
CALLфункция([команды,]);
константа([команды,]);
???
CCif (flag_c(команда)) функция();???
CNCif (flag_nc(команда)) функция();???
CZif (flag_z(команда)) функция();???
CNZif (flag_nz(команда)) функция();???
CMif (flag_m(команда)) функция();???
CPif (flag_p(команда)) функция();???
CPEif (flag_pe(команда)) функция();???
CPOif (flag_po(команда)) функция();???
RETreturn;???
RCif (flag_c(команда)) return;???
RNCif (flag_nc(команда)) return;???
RZif (flag_z(команда)) return;???
RNZif (flag_nz(команда)) return;???
RMif (flag_m(команда)) return;???
RPif (flag_p(команда)) return;???
RPEif (flag_pe(команда)) return;???
RPOif (flag_po(команда)) return;???
Дополнительные возможности
Cmm (вариант 1)Cmm (вариант 2)Ассемблер 8080
if (условие) команда
for (команда; условие; команда) команда
do { } while (условие)
while (условие) команда
метка:
goto метка
push_pop(регистры,) команда
breakJMP
continueJMP
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 == регистр8CMP регистр8 + JNZ
a == *hlCMP M + JNZ
a == 0ORA A + JNZЕсли вы хотите получить CPI, то замените a == 0 на flag_z(Compare(a, 0))
a == числоCPI число + JNZ
a != регистр8CMP регистр8 + JZ
a != *hlCMP M + JZ
a != 0ORA A + JZЕсли вы хотите получить CPI, то замените a != 0 на flag_nz(Compare(a, 0))
a != числоCPI число + JZ
a >= регистр8CMP регистр8 + JNС
a >= *hlCMP M + JNС
a >= числоCPI число + JNС
a < регистр8CMP регистр8 + JС
a < *hlCMP 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???
;???