Загрузка данных


Разработать программную среду для создания и отладки модулей на языках Ассемблера

Порядок отладки:

Запустить программу и ввести простую ассемблерную команду MOV AX, 5 — программа должна вывести машинный код. Проверить команду ADD BX, AX — должна корректно распознать регистры. Ввести несуществующую команду XYZ AX, BX — программа должна выдать сообщение об ошибке. Проверить программу с меткой START: и переходом JMP START.

Фрагменты кода:

```python
registers = {
    'AX': '000', 'BX': '001', 'CX': '010', 'DX': '011'
}

def encode_mov(dest, src):
    return f"1011{registers[dest]}{int(src):08b}"

def encode_add(dest, src):
    return f"0000{registers[dest]}{registers[src]}"
```

Полный код:

```python
print("=== Программная среда для создания и отладки модулей на Ассемблере ===\n")

# Таблица кодов регистров
registers = {
    'AX': '000', 'BX': '001', 'CX': '010', 'DX': '011',
    'AL': '100', 'BL': '101', 'CL': '110', 'DL': '111'
}

# Таблица кодов команд
opcodes = {
    'MOV': '1011',
    'ADD': '0000',
    'SUB': '0001',
    'JMP': '1110'
}

def assemble(line):
    line = line.strip().upper()
    if not line or line.startswith(';'):
        return None, "комментарий"
    
    parts = line.replace(',', ' ').split()
    if len(parts) < 2:
        return None, "ошибка: неверный формат"
    
    cmd = parts[0]
    
    # Обработка JMP
    if cmd == 'JMP':
        if len(parts) < 2:
            return None, "ошибка: нет метки для JMP"
        return f"{opcodes['JMP']}0000{int(parts[1]):08b}", None
    
    # Обработка MOV, ADD, SUB
    if cmd not in opcodes:
        return None, f"ошибка: неизвестная команда '{cmd}'"
    
    if len(parts) < 3:
        return None, "ошибка: не хватает операндов"
    
    dest, src = parts[1], parts[2]
    
    if dest not in registers:
        return None, f"ошибка: неизвестный регистр '{dest}'"
    
    # MOV с числом
    if cmd == 'MOV' and src.isdigit():
        return f"{opcodes['MOV']}{registers[dest]}{int(src):08b}", None
    
    # MOV, ADD, SUB с регистром
    if src in registers:
        return f"{opcodes[cmd]}{registers[dest]}{registers[src]}", None
    
    return None, f"ошибка: неверный операнд '{src}'"

print("Введите команды ассемблера (пустая строка для выхода):")
print("Поддерживаемые команды: MOV AX, 5 | MOV AX, BX | ADD AX, BX | SUB AX, BX | JMP START\n")

line_num = 1
while True:
    line = input(f"{line_num:03d}: ")
    if not line:
        break
    
    machine_code, error = assemble(line)
    
    if error:
        if error == "комментарий":
            print(f"     ; {line.strip()}")
        else:
            print(f"     ОШИБКА: {error}")
    else:
        print(f"     {machine_code}  ; {line.strip()}")
    
    line_num += 1

print("\nРабота среды завершена.")