Перейти к содержанию

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

Метки

Метки пишутся как идентификатор с : в начале строки или перед инструкцией. Регистр не важен.

main:
    LDI.DW SP, 0x00080000
    JMP main

Директивы

Директива Назначение
.ORG addr Установить текущий адрес сборки
.TEXT / .CODE Переключиться на сегмент кода
.DATA Переключиться на сегмент данных
.BSS Переключиться на сегмент неинициализированных данных
.DB ... Байты
.DW ... Big-endian слова
.DD ... Big-endian dword'ы
.ENTRY sym Объявить точку входа (объектный режим)
.GLOBAL sym Экспортировать символ для линкера
.EXTERN sym Объявить внешний символ

В .DB/.DW/.DD можно использовать числа, символы, строки и арифметические выражения:

.db "Hello", 0x0A, 0
.dw (80*25+1)*2
.dd 0x00050000

Поддерживаемые 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

Ассемблер сам выбирает самый компактный режим. Квадратные скобки обязательны.

LOD.B XL1, [IX]
STR.W A0, [0x00020018]
LOD.DW EX1, [IX:IY+4]

Пример программы

.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.

Для кросс-файловых символов используются:

.GLOBAL _start         ; экспортировать символ
.EXTERN putc           ; импортировать символ