убрать харкод в 4м проходе
This commit is contained in:
parent
05b4230058
commit
876e00a1ca
|
|
@ -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)
|
||||
|
|
|
|||
101
kvs_pass4.py
101
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:
|
||||
section = row[segment_idx].strip()
|
||||
|
||||
if section == '.text':
|
||||
current_pos = instr_virt_addr - vaddr_text
|
||||
elif 0x402000 <= instr_virt_addr < 0x403000:
|
||||
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)}")
|
||||
|
|
|
|||
167
инструменты/kvs_elf.py
Normal file
167
инструменты/kvs_elf.py
Normal file
|
|
@ -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('<H', self.ET_EXEC)) # e_type
|
||||
header.extend(struct.pack('<H', self.EM_X86_64)) # e_machine
|
||||
header.extend(struct.pack('<I', self.EV_CURRENT)) # e_version
|
||||
header.extend(struct.pack('<Q', self.entry_point)) # e_entry
|
||||
header.extend(struct.pack('<Q', 64)) # e_phoff (программные заголовки сразу после ELF)
|
||||
header.extend(struct.pack('<Q', 0)) # e_shoff (нет секций)
|
||||
header.extend(struct.pack('<I', 0)) # e_flags
|
||||
header.extend(struct.pack('<H', 64)) # e_ehsize
|
||||
header.extend(struct.pack('<H', 56)) # e_phentsize
|
||||
header.extend(struct.pack('<H', 2)) # e_phnum (2 программных заголовка)
|
||||
header.extend(struct.pack('<H', 0)) # e_shentsize
|
||||
header.extend(struct.pack('<H', 0)) # e_shnum
|
||||
header.extend(struct.pack('<H', 0)) # e_shstrndx
|
||||
|
||||
return bytes(header)
|
||||
|
||||
def set_entry_point(self, addr):
|
||||
"""Устанавливает точку входа"""
|
||||
self.entry_point = addr
|
||||
|
||||
|
||||
class ProgramHeaders:
|
||||
"""Генератор программных заголовков ELF"""
|
||||
|
||||
def __init__(self):
|
||||
self.text_offset = 0x1000
|
||||
self.text_vaddr = text_vaddr_base
|
||||
self.text_paddr = text_vaddr_base
|
||||
self.text_filesz = 0
|
||||
self.text_memsz = 0
|
||||
|
||||
self.data_offset = 0x2000
|
||||
self.data_vaddr = 0
|
||||
self.data_paddr = 0
|
||||
self.data_filesz = 0
|
||||
self.data_memsz = 0
|
||||
|
||||
def get_text_header_bytes(self):
|
||||
"""Возвращает байты программного заголовка для TEXT сегмента"""
|
||||
header = bytearray()
|
||||
header.extend(struct.pack('<I', ELFHeader.PT_LOAD)) # p_type
|
||||
header.extend(struct.pack('<I', ELFHeader.PF_R | ELFHeader.PF_X)) # p_flags = RX
|
||||
header.extend(struct.pack('<Q', self.text_offset)) # p_offset
|
||||
header.extend(struct.pack('<Q', self.text_vaddr)) # p_vaddr
|
||||
header.extend(struct.pack('<Q', self.text_paddr)) # p_paddr
|
||||
header.extend(struct.pack('<Q', self.text_filesz)) # p_filesz
|
||||
header.extend(struct.pack('<Q', self.text_memsz)) # p_memsz
|
||||
header.extend(struct.pack('<Q', PAGE_SIZE)) # p_align
|
||||
return bytes(header)
|
||||
|
||||
def get_data_header_bytes(self):
|
||||
"""Возвращает байты программного заголовка для DATA сегмента"""
|
||||
header = bytearray()
|
||||
header.extend(struct.pack('<I', ELFHeader.PT_LOAD)) # p_type
|
||||
header.extend(struct.pack('<I', ELFHeader.PF_R | ELFHeader.PF_W)) # p_flags = RW
|
||||
header.extend(struct.pack('<Q', self.data_offset)) # p_offset
|
||||
header.extend(struct.pack('<Q', self.data_vaddr)) # p_vaddr
|
||||
header.extend(struct.pack('<Q', self.data_paddr)) # p_paddr
|
||||
header.extend(struct.pack('<Q', self.data_filesz)) # p_filesz
|
||||
header.extend(struct.pack('<Q', self.data_memsz)) # p_memsz
|
||||
header.extend(struct.pack('<Q', PAGE_SIZE)) # p_align
|
||||
return bytes(header)
|
||||
|
||||
def set_text_sizes(self, filesz, memsz=None):
|
||||
"""Устанавливает размеры TEXT сегмента"""
|
||||
self.text_filesz = filesz
|
||||
self.text_memsz = memsz if memsz is not None else filesz
|
||||
|
||||
def set_data_sizes(self, filesz, memsz=None):
|
||||
"""Устанавливает размеры DATA сегмента"""
|
||||
self.data_filesz = filesz
|
||||
self.data_memsz = memsz if memsz is not None else filesz
|
||||
|
||||
def set_data_vaddr(self, vaddr):
|
||||
"""Устанавливает виртуальный адрес DATA сегмента"""
|
||||
self.data_vaddr = vaddr
|
||||
self.data_paddr = vaddr
|
||||
|
||||
|
||||
def generate_elf_bytes(entry_point, text_filesz, text_memsz, data_vaddr, data_filesz, data_memsz):
|
||||
"""
|
||||
Генерирует полный ELF заголовок (ELF header + 2 program headers)
|
||||
Возвращает bytes
|
||||
"""
|
||||
elf = ELFHeader()
|
||||
elf.set_entry_point(entry_point)
|
||||
|
||||
ph = ProgramHeaders()
|
||||
ph.set_text_sizes(text_filesz, text_memsz)
|
||||
ph.set_data_sizes(data_filesz, data_memsz)
|
||||
ph.set_data_vaddr(data_vaddr)
|
||||
|
||||
# Собираем всё вместе
|
||||
result = bytearray()
|
||||
result.extend(elf.get_header_bytes()) # 64 байта
|
||||
result.extend(ph.get_text_header_bytes()) # 56 байт
|
||||
result.extend(ph.get_data_header_bytes()) # 56 байт
|
||||
|
||||
return bytes(result)
|
||||
|
||||
|
||||
# Для обратной совместимости со старым кодом
|
||||
def get_elf_header_bytes():
|
||||
"""Возвращает ELF заголовок с заглушками (для первого прохода)"""
|
||||
elf = ELFHeader()
|
||||
return elf.get_header_bytes()
|
||||
|
||||
|
||||
def get_text_phdr_bytes():
|
||||
"""Возвращает программный заголовок TEXT с заглушками"""
|
||||
ph = ProgramHeaders()
|
||||
return ph.get_text_header_bytes()
|
||||
|
||||
|
||||
def get_data_phdr_bytes():
|
||||
"""Возвращает программный заголовок DATA с заглушками"""
|
||||
ph = ProgramHeaders()
|
||||
return ph.get_data_header_bytes()
|
||||
835
тесты/длин_тест.квс
Normal file
835
тесты/длин_тест.квс
Normal file
|
|
@ -0,0 +1,835 @@
|
|||
; длин_тест9.квс
|
||||
; Тест: запутанные переходы, крякмис (для длинных переходов)
|
||||
|
||||
.текст
|
||||
.глобал _start
|
||||
|
||||
_start:
|
||||
; Инициализация регистров
|
||||
переместить_имм раикс, 10 ; rax = 10
|
||||
переместить_имм рбикс, 5 ; rbx = 5
|
||||
переместить_имм рсикс, 10 ; rcx = 10 (для проверки ZF в jz)
|
||||
|
||||
; ПЕРВЫЙ ПЕРЕХОД: переход_если_не_ноль
|
||||
; ZF=0 (так как rax=10), значит jnz сработает
|
||||
; Прыгаем к метке 'проверка_2', пропуская мертвый_код_1
|
||||
переход_если_не_ноль проверка_2
|
||||
|
||||
; --- МЕРТВЫЙ КОД 1 ---
|
||||
; Этот код НЕ должен выполниться
|
||||
; Добавляем "мусор", чтобы точно выйти за пределы короткого перехода
|
||||
переместить_имм раикс, 1
|
||||
переместить_имм рдиай, 1
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 2
|
||||
переместить_имм рдиай, 2
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 3
|
||||
переместить_имм рдиай, 3
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 4
|
||||
переместить_имм рдиай, 4
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 5
|
||||
переместить_имм рдиай, 5
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 6
|
||||
переместить_имм рдиай, 6
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 7
|
||||
переместить_имм рдиай, 7
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 8
|
||||
переместить_имм рдиай, 8
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 9
|
||||
переместить_имм рдиай, 9
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 10
|
||||
переместить_имм рдиай, 10
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 11
|
||||
переместить_имм рдиай, 11
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 12
|
||||
переместить_имм рдиай, 12
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 13
|
||||
переместить_имм рдиай, 13
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 14
|
||||
переместить_имм рдиай, 14
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
переместить_имм раикс, 15
|
||||
переместить_имм рдиай, 15
|
||||
переместить_имм рсиай, msg_dead_1
|
||||
переместить_имм рдикс, len_msg_dead_1
|
||||
вызов_системы
|
||||
; ---------------------
|
||||
|
||||
проверка_2:
|
||||
; ДОПОЛНИТЕЛЬНЫЙ ПЕРЕХОД 1: "Два шага вперед" - переход через мертвый_код_2 и мертвый_код_3
|
||||
; Прыгаем к проверка_4, минуя мертвый_код_2 и мертвый_код_3
|
||||
переход проверка_4
|
||||
|
||||
; --- МЕРТВЫЙ КОД 2 ---
|
||||
; Этот код НЕ должен выполниться из-за прыжка выше
|
||||
переместить_имм раикс, 1
|
||||
переместить_имм рдиай, 1
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 2
|
||||
переместить_имм рдиай, 2
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 3
|
||||
переместить_имм рдиай, 3
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 4
|
||||
переместить_имм рдиай, 4
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 5
|
||||
переместить_имм рдиай, 5
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 6
|
||||
переместить_имм рдиай, 6
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 7
|
||||
переместить_имм рдиай, 7
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 8
|
||||
переместить_имм рдиай, 8
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 9
|
||||
переместить_имм рдиай, 9
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 10
|
||||
переместить_имм рдиай, 10
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 11
|
||||
переместить_имм рдиай, 11
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 12
|
||||
переместить_имм рдиай, 12
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 13
|
||||
переместить_имм рдиай, 13
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 14
|
||||
переместить_имм рдиай, 14
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
переместить_имм раикс, 15
|
||||
переместить_имм рдиай, 15
|
||||
переместить_имм рсиай, msg_dead_2
|
||||
переместить_имм рдикс, len_msg_dead_2
|
||||
вызов_системы
|
||||
; ---------------------
|
||||
|
||||
мертвый_код_3:
|
||||
; ЖИВОЙ КОД 3: Этот код выполнится благодаря прыжку "назад"
|
||||
; Выведем сообщение, чтобы убедиться, что он выполнился
|
||||
переместить_имм раикс, 1
|
||||
переместить_имм рдиай, 1
|
||||
переместить_имм рсиай, msg_live_from_3
|
||||
переместить_имм рдикс, len_msg_live_from_3
|
||||
вызов_системы
|
||||
; ДОПОЛНИТЕЛЬНЫЙ ПЕРЕХОД 3: "Четыре вперед" - переход через мертвый_код_4, 5, 6, 7
|
||||
; Цель слишком далеко для короткого перехода. Используем длинный.
|
||||
; Прыгаем к проверка_8
|
||||
переход проверка_8
|
||||
; ---------------------
|
||||
|
||||
проверка_4:
|
||||
; ЧЕТВЁРТЫЙ ПЕРЕХОД: переход_если_больше
|
||||
; Сравниваем rax (10) и rbx (5) -> 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
|
||||
Loading…
Reference in a new issue