diff --git a/kvs_builder.py b/kvs_builder.py index 5f6d136..d8a24b9 100644 --- a/kvs_builder.py +++ b/kvs_builder.py @@ -94,7 +94,7 @@ def main(): print(f" Размер файла: {max(addresses) + 1} байт (0x{max(addresses) + 1:x})") print(f" Выходной файл: {elf_file}") print(f"\n Исполняемый файл готов!") - print(f" Запустить: ./{elf_file}") + print(f" Запустить: {elf_file}") else: print("Ошибка при сборке") sys.exit(1) diff --git a/kvs_pass4.py b/kvs_pass4.py index 5d0ae3d..a253742 100644 --- a/kvs_pass4.py +++ b/kvs_pass4.py @@ -17,9 +17,9 @@ from kvs_data import PAGE_SIZE, text_vaddr_base, align_up from kvs_encoder import encode_instruction # ========== ГЛОБАЛЬНОЕ СОСТОЯНИЕ ========== -vaddr_text = text_vaddr_base -vaddr_data = 0x402000 -vaddr_bnd = None +vaddr_text = None # будет прочитано из CSV +vaddr_data = None # будет прочитано из CSV +vaddr_bnd = None # будет прочитано из CSV labels = {} label_sections = {} @@ -53,6 +53,57 @@ def parse_command(cmd_str): return mnemonic, operands +def detect_section_addresses(entries, headers): + """ + Определяет виртуальные адреса секций из CSV. + """ + global vaddr_text, vaddr_data, vaddr_bnd + + try: + segment_idx = headers.index('сегмент') + virt_addr_idx = headers.index('виртуальный_адрес') + except ValueError as e: + print(f"Ошибка: не найдена нужная колонка в CSV: {e}") + sys.exit(1) + + found_text = False + found_data = False + found_bnd = False + + for row in entries: + segment = row[segment_idx].strip() + virt_addr_str = row[virt_addr_idx].strip() + + if not virt_addr_str.startswith('0x'): + continue + + virt_addr = int(virt_addr_str, 16) + + if segment == '.text' and not found_text: + vaddr_text = virt_addr + found_text = True + print(f" .text: 0x{vaddr_text:x}") + + elif segment == '.data' and not found_data: + vaddr_data = virt_addr + found_data = True + print(f" .data: 0x{vaddr_data:x}") + + elif segment == '.bss' and not found_bnd: + vaddr_bnd = virt_addr + found_bnd = True + print(f" .bss: 0x{vaddr_bnd:x}") + + # Проверяем, что все нужные секции найдены + if not found_text: + print(" Ошибка: секция .text не найдена в CSV") + sys.exit(1) + + if not found_data: + print(" Предупреждение: секция .data не найдена в CSV") + vaddr_data = 0x402000 # fallback + + def collect_labels_from_csv(entries, headers): """ Собирает метки из CSV, используя колонку 'виртуальный_адрес' @@ -80,6 +131,26 @@ def collect_labels_from_csv(entries, headers): label_sections[label_name] = '' +def get_section_for_address(virt_addr): + """ + Определяет секцию по виртуальному адресу + """ + if vaddr_text is not None and virt_addr >= vaddr_text: + # Простая эвристика: если адрес в диапазоне .text (первые 0x1000 байт) + if virt_addr < vaddr_text + PAGE_SIZE: + return '.text' + + if vaddr_data is not None and virt_addr >= vaddr_data: + if virt_addr < vaddr_data + PAGE_SIZE: + return '.data' + + if vaddr_bnd is not None and virt_addr >= vaddr_bnd: + if virt_addr < vaddr_bnd + PAGE_SIZE: + return '.bss' + + return '.unknown' + + def reencode_instructions(entries, headers): try: source_with_values_idx = headers.index('команда_со_значениями') @@ -87,6 +158,7 @@ def reencode_instructions(entries, headers): addr_idx = headers.index('адрес') virt_addr_idx = headers.index('виртуальный_адрес') byte_idx = headers.index('байт') + segment_idx = headers.index('сегмент') except ValueError as e: print(f"Ошибка: не найдена нужная колонка в CSV: {e}") sys.exit(1) @@ -143,19 +215,27 @@ def reencode_instructions(entries, headers): print(f" В диапазоне [-128..127]: {-128 <= offset <= 127}") # Вычисляем current_pos как смещение в секции - # Определяем секцию по виртуальному адресу - if 0x401000 <= instr_virt_addr < 0x402000: - current_pos = instr_virt_addr - vaddr_text - elif 0x402000 <= instr_virt_addr < 0x403000: - current_pos = instr_virt_addr - vaddr_data - else: - current_pos = instr_virt_addr + section = row[segment_idx].strip() + + if section == '.text': + current_pos = instr_virt_addr - vaddr_text + elif section == '.data': + current_pos = instr_virt_addr - vaddr_data + elif section == '.bss': + current_pos = instr_virt_addr - vaddr_bnd if vaddr_bnd else 0 + else: + # Fallback: определяем по диапазону адресов + if vaddr_text and 0x401000 <= instr_virt_addr < 0x402000: + current_pos = instr_virt_addr - vaddr_text + elif vaddr_data and 0x402000 <= instr_virt_addr < 0x403000: + current_pos = instr_virt_addr - vaddr_data + else: + current_pos = instr_virt_addr - # Преобразуем операнды: если строка с 0x, оставляем как есть - # Кодировщик сам разберётся с isdigit() encoded = encode_instruction( mnemonic, operands, labels, label_sections, symbols, - vaddr_text, vaddr_data, current_pos, vaddr_bnd + vaddr_text, vaddr_data if vaddr_data else 0, + current_pos, vaddr_bnd if vaddr_bnd else 0 ) if mnemonic.startswith('короткий_переход') or mnemonic.startswith('переход'): @@ -219,6 +299,9 @@ def main(): headers, entries = read_csv(csv_file) + print(f"\n--- Определение адресов секций из CSV ---") + detect_section_addresses(entries, headers) + print(f"\n--- Сбор меток из CSV ---") collect_labels_from_csv(entries, headers) print(f"Найдено меток: {len(labels)}") diff --git a/инструменты/kvs_elf.py b/инструменты/kvs_elf.py new file mode 100644 index 0000000..5ab14b5 --- /dev/null +++ b/инструменты/kvs_elf.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +kvs_elf.py - Генерация ELF заголовков для КВС +Содержит функции для создания ELF64 заголовка и программных заголовков +""" + +import struct +from kvs_data import PAGE_SIZE, text_vaddr_base + + +class ELFHeader: + """Генератор ELF64 заголовков""" + + # ELF константы + EI_MAG0 = 0x7F + EI_MAG1 = ord('E') + EI_MAG2 = ord('L') + EI_MAG3 = ord('F') + EI_CLASS64 = 2 + EI_DATA2LSB = 1 + EI_VERSION = 1 + ET_EXEC = 2 + EM_X86_64 = 62 + EV_CURRENT = 1 + PT_LOAD = 1 + PF_R = 0x4 + PF_W = 0x2 + PF_X = 0x1 + + def __init__(self): + self.entry_point = 0 # будет заполнено позже + + def get_header_bytes(self): + """Возвращает байты ELF заголовка""" + # e_ident (16 байт) + e_ident = bytes([ + self.EI_MAG0, self.EI_MAG1, self.EI_MAG2, self.EI_MAG3, # magic + self.EI_CLASS64, # ELFCLASS64 + self.EI_DATA2LSB, # ELFDATA2LSB + self.EI_VERSION, # EV_CURRENT + 0, # OS ABI (none) + 0, # ABI version + 0, 0, 0, 0, 0, 0, 0 # padding + ]) + + # Собираем заголовок + header = bytearray(e_ident) + header.extend(struct.pack(' rax > rbx, ZF=0, SF=0, OF=0 + сравнить раикс, рбикс + ; Условие jg: ZF=0 (истина) И SF=OF (0=0, истина). jg СРАБОТАЕТ. + ; Мы хотим прыгнуть МИМО мертвого кода 4, если jg сработает (т.е. если rax > rbx). + переход_если_больше мимо_мертвого_кода_4 + ; --- МЕРТВЫЙ КОД 4 --- + ; Этот код НЕ должен выполниться (так как jg сработал) + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 2 + переместить_имм рдиай, 2 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 3 + переместить_имм рдиай, 3 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 4 + переместить_имм рдиай, 4 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 5 + переместить_имм рдиай, 5 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 6 + переместить_имм рдиай, 6 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 7 + переместить_имм рдиай, 7 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 8 + переместить_имм рдиай, 8 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 9 + переместить_имм рдиай, 9 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 10 + переместить_имм рдиай, 10 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 11 + переместить_имм рдиай, 11 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 12 + переместить_имм рдиай, 12 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 13 + переместить_имм рдиай, 13 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 14 + переместить_имм рдиай, 14 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + переместить_имм раикс, 15 + переместить_имм рдиай, 15 + переместить_имм рсиай, msg_dead_4 + переместить_имм рдикс, len_msg_dead_4 + вызов_системы + ; --------------------- +мимо_мертвого_кода_4: + + ; ДОПОЛНИТЕЛЬНЫЙ ПЕРЕХОД 2: "Один назад" - переход к мертвому_коду_3 (делая его живым) + переход мертвый_код_3 + + ; --- МЕРТВЫЙ КОД 5 --- + ; Этот код НЕ должен выполниться + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 2 + переместить_имм рдиай, 2 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 3 + переместить_имм рдиай, 3 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 4 + переместить_имм рдиай, 4 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 5 + переместить_имм рдиай, 5 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 6 + переместить_имм рдиай, 6 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 7 + переместить_имм рдиай, 7 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 8 + переместить_имм рдиай, 8 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 9 + переместить_имм рдиай, 9 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 10 + переместить_имм рдиай, 10 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 11 + переместить_имм рдиай, 11 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 12 + переместить_имм рдиай, 12 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 13 + переместить_имм рдиай, 13 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 14 + переместить_имм рдиай, 14 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + переместить_имм раикс, 15 + переместить_имм рдиай, 15 + переместить_имм рсиай, msg_dead_5 + переместить_имм рдикс, len_msg_dead_5 + вызов_системы + ; --------------------- + + ; --- МЕРТВЫЙ КОД 6 --- + ; Этот код НЕ должен выполниться + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 2 + переместить_имм рдиай, 2 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 3 + переместить_имм рдиай, 3 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 4 + переместить_имм рдиай, 4 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 5 + переместить_имм рдиай, 5 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 6 + переместить_имм рдиай, 6 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 7 + переместить_имм рдиай, 7 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 8 + переместить_имм рдиай, 8 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 9 + переместить_имм рдиай, 9 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 10 + переместить_имм рдиай, 10 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 11 + переместить_имм рдиай, 11 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 12 + переместить_имм рдиай, 12 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 13 + переместить_имм рдиай, 13 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 14 + переместить_имм рдиай, 14 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + переместить_имм раикс, 15 + переместить_имм рдиай, 15 + переместить_имм рсиай, msg_dead_6 + переместить_имм рдикс, len_msg_dead_6 + вызов_системы + ; --------------------- + + ; --- МЕРТВЫЙ КОД 7 --- + ; Этот код НЕ должен выполниться + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 2 + переместить_имм рдиай, 2 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 3 + переместить_имм рдиай, 3 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 4 + переместить_имм рдиай, 4 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 5 + переместить_имм рдиай, 5 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 6 + переместить_имм рдиай, 6 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 7 + переместить_имм рдиай, 7 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 8 + переместить_имм рдиай, 8 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 9 + переместить_имм рдиай, 9 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 10 + переместить_имм рдиай, 10 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 11 + переместить_имм рдиай, 11 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 12 + переместить_имм рдиай, 12 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 13 + переместить_имм рдиай, 13 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 14 + переместить_имм рдиай, 14 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + переместить_имм раикс, 15 + переместить_имм рдиай, 15 + переместить_имм рсиай, msg_dead_7 + переместить_имм рдикс, len_msg_dead_7 + вызов_системы + ; --------------------- + +проверка_8: + ; СЕДЬМОЙ ПЕРЕХОД: переход_если_перенос + ; Выполним вычитание, которое вызовет перенос: rbx - rax = 5 - 10 + переместить_имм рбикс, 5 ; rbx = 5 + переместить_имм раикс, 10 ; rax = 10 + ; rbx - rax = 5 - 10 -> CF=1 + вычесть рбикс, раикс ; rbx = rbx - rax = 5 - 10. Это вызовет перенос (CF=1). + ; Условие jc: CF=1. CF=1. jc СРАБОТАЕТ. + ; Мы хотим прыгнуть МИМО мертвого кода 8, если jc сработает (т.е. если был перенос). + переход_если_перенос мимо_мертвого_кода_8 + ; --- МЕРТВЫЙ КОД 8 --- + ; Этот код НЕ должен выполниться (так как jc сработал) + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 2 + переместить_имм рдиай, 2 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 3 + переместить_имм рдиай, 3 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 4 + переместить_имм рдиай, 4 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 5 + переместить_имм рдиай, 5 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 6 + переместить_имм рдиай, 6 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 7 + переместить_имм рдиай, 7 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 8 + переместить_имм рдиай, 8 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 9 + переместить_имм рдиай, 9 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 10 + переместить_имм рдиай, 10 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 11 + переместить_имм рдиай, 11 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 12 + переместить_имм рдиай, 12 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 13 + переместить_имм рдиай, 13 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 14 + переместить_имм рдиай, 14 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + переместить_имм раикс, 15 + переместить_имм рдиай, 15 + переместить_имм рсиай, msg_dead_8 + переместить_имм рдикс, len_msg_dead_8 + вызов_системы + ; --------------------- + +мимо_мертвого_кода_8: + + ; ВОСЬМОЙ ПЕРЕХОД: переход_если_нет_переноса + ; Убедимся, что CF=0. Выполним операцию, которая сбросит CF. + сравнить раикс, раикс ; CF = 0 (так как rax - rax = 0, без переноса) + ; Условие jnc: CF=0. CF=0. jnc СРАБОТАЕТ. + ; Мы хотим прыгнуть МИМО мертвого кода 9, если jnc сработает (т.е. если НЕ было переноса). + переход_если_нет_переноса мимо_мертвого_кода_9 + ; --- МЕРТВЫЙ КОД 9 --- + ; Этот код НЕ должен выполниться (так как jnc сработал) + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 2 + переместить_имм рдиай, 2 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 3 + переместить_имм рдиай, 3 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 4 + переместить_имм рдиай, 4 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 5 + переместить_имм рдиай, 5 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 6 + переместить_имм рдиай, 6 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 7 + переместить_имм рдиай, 7 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 8 + переместить_имм рдиай, 8 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 9 + переместить_имм рдиай, 9 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 10 + переместить_имм рдиай, 10 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 11 + переместить_имм рдиай, 11 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 12 + переместить_имм рдиай, 12 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 13 + переместить_имм рдиай, 13 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 14 + переместить_имм рдиай, 14 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + переместить_имм раикс, 15 + переместить_имм рдиай, 15 + переместить_имм рсиай, msg_dead_9 + переместить_имм рдикс, len_msg_dead_9 + вызов_системы + ; --------------------- + +мимо_мертвого_кода_9: + + ; ДЕВЯТЫЙ ПЕРЕХОД: переход (безусловный) + ; Просто прыгаем мимо мертвого кода 10. + переход мимо_мертвого_кода_10 + ; --- МЕРТВЫЙ КОД 10 --- + ; Этот код НЕ должен выполниться (так как jmp сработал) + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 2 + переместить_имм рдиай, 2 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 3 + переместить_имм рдиай, 3 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 4 + переместить_имм рдиай, 4 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 5 + переместить_имм рдиай, 5 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 6 + переместить_имм рдиай, 6 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 7 + переместить_имм рдиай, 7 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 8 + переместить_имм рдиай, 8 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 9 + переместить_имм рдиай, 9 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 10 + переместить_имм рдиай, 10 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 11 + переместить_имм рдиай, 11 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 12 + переместить_имм рдиай, 12 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 13 + переместить_имм рдиай, 13 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 14 + переместить_имм рдиай, 14 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + переместить_имм раикс, 15 + переместить_имм рдиай, 15 + переместить_имм рсиай, msg_dead_10 + переместить_имм рдикс, len_msg_dead_10 + вызов_системы + ; --------------------- + +мимо_мертвого_кода_10: + + ; --- ВЫВОД ЦЕЛЕВОГО СООБЩЕНИЯ --- +вывести_сообщение: + переместить_имм раикс, 1 + переместить_имм рдиай, 1 + переместить_имм рсиай, msg_success + переместить_имм рдикс, len_msg_success + вызов_системы + + ; --- ЗАВЕРШЕНИЕ --- + переместить_имм раикс, 60 + переместить_имм рдиай, 0 + вызов_системы + +.данные + ; Перемешиваем строки и константы + ; "Живой из 3!\n" = 8 букв * 2 + 1 (!) + 1 (\n от .строка_нуль) = 16 + 2 = 18 байт на содержимое. len = 18 + msg_live_from_3: .строка_нуль "Живой из 3!\n" + .константа len_msg_live_from_3 = 18 + ; "Успех!\n" = 5 букв * 2 + 1 (!) + 1 (\n от .строка_нуль) = 10 + 2 = 12 байт на содержимое. len = 12 + msg_success: .строка_нуль "Успех!\n" + .константа len_msg_success = 12 + ; "Мертвый код 10!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_10: .строка_нуль "Мертвый код 10!" + .константа len_msg_dead_10 = 19 + ; "Мертвый код 9!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_9: .строка_нуль "Мертвый код 9!" + .константа len_msg_dead_9 = 19 + ; "Мертвый код 8!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_8: .строка_нуль "Мертвый код 8!" + .константа len_msg_dead_8 = 19 + ; "Мертвый код 7!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_7: .строка_нуль "Мертвый код 7!" + .константа len_msg_dead_7 = 19 + ; "Мертвый код 6!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_6: .строка_нуль "Мертвый код 6!" + .константа len_msg_dead_6 = 19 + ; "Мертвый код 5!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_5: .строка_нуль "Мертвый код 5!" + .константа len_msg_dead_5 = 19 + ; "Мертвый код 4!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_4: .строка_нуль "Мертвый код 4!" + .константа len_msg_dead_4 = 19 + ; "Мертвый код 3!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_3: .строка_нуль "Мертвый код 3!" + .константа len_msg_dead_3 = 19 + ; "Мертвый код 2!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_2: .строка_нуль "Мертвый код 2!" + .константа len_msg_dead_2 = 19 + ; "Мертвый код 1!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строка_нуль) = 14 + 4 + 1 = 19 байт на содержимое. len = 19 + msg_dead_1: .строка_нуль "Мертвый код 1!" + .константа len_msg_dead_1 = 19 \ No newline at end of file