CASM148
CASM148
CASM148 (Cawas Assembler for i80148) - основной ассемблер проекта. Превращает исходники .asm в объектные файлы .o или сразу в плоский бинарник .bin.
| Параметр | Значение |
|---|---|
| Версия | 0.8 |
| Целевая архитектура | i80148 (32-бит, flat) |
| Порядок байтов | Big Endian |
| Формат вывода | .bin + .hex (flat) или .o (объектный файл) |
| Язык | Python 3 |
| Файл | CASM148.py |
Использование¶
# Плоский бинарник
python CASM148.py program.asm -o program.bin
# Объектный файл для линковки
python CASM148.py -c program.asm -o program.o
# Объектный файл в JSON (для отладки)
python CASM148.py -c --obj-format json program.asm -o program.o.json
Если -o не указан, ассемблер создаёт output.bin/output.hex или output.o в текущей директории.
Опции командной строки¶
| Опция | Описание |
|---|---|
-c |
Режим компиляции: создать объектный файл вместо плоского бинарника |
--obj-format binary\|json |
Формат объектного файла (по умолчанию binary) |
-o file |
Имя выходного файла |
Синтаксис¶
Комментарии¶
Числа¶
| Формат | Пример |
|---|---|
| Hex | 0x1A |
| Bin | 0b1010 |
| Dec | 42 |
Метки¶
Метки пишутся как идентификатор с : в начале строки или перед инструкцией. Регистр не важен.
Директивы¶
| Директива | Назначение |
|---|---|
.ORG addr |
Установить текущий адрес сборки |
.TEXT / .CODE |
Переключиться на сегмент кода |
.DATA |
Переключиться на сегмент данных |
.BSS |
Переключиться на сегмент неинициализированных данных |
.DB ... |
Байты |
.DW ... |
Big-endian слова |
.DD ... |
Big-endian dword'ы |
.ENTRY sym |
Объявить точку входа (объектный режим) |
.GLOBAL sym |
Экспортировать символ для линкера |
.EXTERN sym |
Объявить внешний символ |
В .DB/.DW/.DD можно использовать числа, символы, строки и арифметические выражения:
Поддерживаемые escape-последовательности в строках: \n, \r, \t, \0, \\.
Строки не завершаются нулём автоматически - если нужно, добавь , 0 вручную.
Регистры¶
| Имя | Адрес | Разрядность | Описание |
|---|---|---|---|
R0 |
00h |
Dword | Аппаратный ноль |
EX1–EX7 |
01h–07h |
Dword | Регистры общего назначения |
X1–X7 |
08h–0Eh |
Word | Младшие слова EX1–EX7 |
XL1–XL7 |
0Fh–15h |
Byte | Младшие байты EX1–EX7 |
IC |
16h |
Dword | Счётчик инструкций |
FL |
17h |
Byte | Флаги |
SP |
18h |
Dword | Указатель стека |
BP |
19h |
Dword | Указатель базы |
IX, IY |
1Ah, 1Bh |
Dword | Индексные регистры |
A0–A7 |
1Ch–23h |
Dword | Адресные регистры |
IDTR |
24h |
Dword | Таблица прерываний |
Внимание: запись в
XLnизменяет только младший байтEXn, старшие три байта сохраняются. ЧтениеXLnвозвращает байт, расширенный нулями.
Условия переходов¶
| Имя | ID | Логика |
|---|---|---|
UNC |
00h |
Безусловный |
CF / C |
01h |
Перенос |
BF / B |
02h |
Заимствование |
SF / S |
03h |
Знак |
OF / O |
04h |
Переполнение |
ZF / Z |
05h |
Ноль |
NZ |
06h |
Не ноль |
GR / G |
07h |
Больше (signed) |
GE |
08h |
Больше или равно |
LS / L |
09h |
Меньше |
LE |
0Ah |
Меньше или равно |
EQ / E |
0Bh |
Равно |
NE |
0Ch |
Не равно |
Условные переходы записываются через точку: JMP.EQ label, JMP.NZ label, JMA.GR label, JMPR.EQ reg.
Система команд¶
Полный список - в разделе Система команд i80148. Кратко:
- Арифметика:
ADD,ADC,SUB,SBB,MUL,IMUL,DIV,IDIV,REM,IREM,INC,DEC. - Логика:
AND,OR,XOR,NOT,LSL,LSR,ASR,ROL,ROR. - Сравнение:
CMP,ICMP. - Переходы:
JMP,JMPR,JMA,CALL,CALLR,CLABS,RET. - Память:
COPY,LDI.b/w/dw,STR.b/w/dw,LOD.b/w/dw. - Стек:
PUSH,POP. - Система:
NOP,HALT,WAIT,CLI,STI,INT,IRET.
Суффиксы .b/.w/.dw задают размер непосредственного операнда:
ADD EX1, EX2 ; регистр-регистр, dword
ADD.B XL1, 5 ; байт
ADD.W X1, 0x1000 ; слово
ADD.DW EX1, 0x12345 ; dword
CMP.DW EX1, 0x1000
Адресация памяти для STR/LOD¶
| Режим | Синтаксис | Кодирование |
|---|---|---|
F |
[0x00020018] |
Плоский 32-битный адрес |
R |
[IX] |
Регистр-косвенный |
RD |
[IX+4], [IX-4] |
Регистр-косвенный + disp8 |
S |
[IX:IY] |
База:смещение |
SD |
[IX:IY+4] |
База:смещение + disp8 |
Ассемблер сам выбирает самый компактный режим. Квадратные скобки обязательны.
Пример программы¶
.ORG 0x00060000
.TEXT
main:
LDI.DW SP, 0x00080000
LDI.DW IX, msg
CALL print_string
HALT
print_string:
LOD.B XL1, [IX]
CMP.B XL1, 0
JMP.EQ ps_done
STR.B XL1, [0x00020018] ; TERM_OUT
INC IX
JMA print_string
ps_done:
RET
.DATA
msg: .db "Hello, World!", 0
Объектный режим¶
В режиме -c ассемблер создаёт объектный файл .o. Он содержит:
- Сегменты
.text,.data,.bss. - Таблицу символов (глобальные через
.GLOBAL). - Таблицу релокаций (
abs32иrel32).
Объектный файл подаётся на вход LINK148.
Для кросс-файловых символов используются: