Разработать программную среду для создания и отладки модулей на языках Ассемблера
Порядок отладки:
Запустить программу и ввести простую ассемблерную команду 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Работа среды завершена.")