В процессе!
Регистр это что то вроде глобальной переменной, только регистры находятся не в оперативной памяти, а прямо в центральном процессоре. Для программиста отличие регистров от глобальных переменных в том, кто некотоыре команды работают только с регистрами.
Программист может использовать следующие 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 | ??? |
| ; | ??? |